我希望将正则表达式与ngPattern指令一起使用,因此应避免使用 g
标志 .
从本质上讲,有许多“简单”规则 .
-
必须有一个或多个单词 .
-
不允许使用单引号(
'
) . -
允许双引号(
"
)但必须配对,即打开和关闭 . -
成对的双引号必须包含一个或多个单词 .
-
双引号与它相邻包装的单词之间不允许有空格 .
-
不允许使用星号(
*
),除非它紧跟在结束双引号之前并且跟在单词后面,没有空格 .
这里有些例子 .
example match
'' false
' ' false
' foo' true
'foo' true
'foo bar' true
'foo bar*' false
'"foo' false
'"foo"' true
'" foo"' false
'"foo "' false
'"foo bar"' true
'"foo *"' false
'"foo*"' true
'foo*"' false
'"foo*" "bar*"' true
'foo "bar*"' true
'"foo* bar"' false
'"foo*" bar' true
我创建了unit tests here
我很难靠近,
我有这样的表达方式
/(")(?:(?=(\\?))\2.)*?\1/
这将匹配成对的双引号之间的文本 . 像这样的东西,
/^.*\*"$/
将匹配以 '*"'
结尾的文本,
你可以看到,我还有很长的路要走,请帮忙 .
正则表达式是否可能是错误的方法?
2 回答
See it in action
Good luck using this in your production codebase
好的,所以dafuq ......
我们要重用的一个重要想法是如何到达一个位置,在此之前你知道有一个偶数个
"
. 即:不幸的是,我们无法在javascript正则表达式中重用模式,因此我们必须在需要的地方重复它 . 即:
基本上,我们从一开始就说(
^
),当我们迭代直到结束($
)时,我们匹配所述模式,即偶数"
.我们将分为两部分 - 左边不会发生,右边不会发生:
(没有包含空格的配对引号)
其余的更容易:
(在某些时候有一个单词边界(
\b
))(或者从评论中的解释来看,除了包装字符串之外不允许)
我们将其分为三个部分:
(1)必须先于
"
:(2)必须遵循非
"
或空格(3)它不在非关闭之前
"
:干净简单的功能:
https://jsfiddle.net/cy9ozmdm/检查结果 .
如果你需要解释 - 写评论,我会写详细的逻辑 .
(想法为你:检查2个变种(清除regExp和功能) - 在10.000测试情况 - 什么工作得更快(并且不会失败:))?)