我们说我有这个正则表达式:
[create|lorem|generate|make|fake].\s+^\d|([1-9]{1,3}) ?([^s\s]+)?
我想匹配这三个:
"create 5 pages" // works
"create 5" // works
"create" // doesn't match
"create " //doesn't match
它首先完美地完成了两个,但最后两个不被识别。
我试图在create
之后与"。"匹配,但这只会匹配"创建"或" createX",或创建意外匹配(即.+
)。我怎么能在第一次"创建"匹配,说:
space
或nothing
,意思是"创建","创建"并且"创建10"会工作吗?我试过这个正则表达式:
/[create|lorem|generate|make|fake][|\s] ?([0-9]{1,3})? ?([^s\s]+)?/g
我在这里更新了小提琴:http://regexr.com/3aa0c - 我希望在这4行上匹配,但如您所见,只有前三个匹配:
答案 0 :(得分:3)
让我们来看看你在这里有什么:
[create|lorem|generate|make|fake].\s+^\d|([1-9]{1,3}) ?([^s\s]+)?
如果我们打破你的正则表达式:
|
中有[]
分隔的单词,归结为“[]
.
)\s+
)^
)\d
)|
)[1-9]{1,3}
)?
)s
的类或空格中,重复零次或一次(([^s\s]+)?
)首先,为什么你的字符串匹配/不匹配:
这是有效的,因为找到了#5和字符串page
的匹配项。 5是一个前面至少有一个空格的单个数字,并形成一个字符串的开头。单词page
匹配,因为这些字符不在s
或空格的类中。
与上述相同,但仅适用于数字5
由于您的字符类/替换构造不正确((|)
vs []
),因此这些都不匹配。其次,你的字符串中间有一个开始字符串锚点,这将阻止在行开头之前出现的任何东西被匹配。
如果你想在交替中匹配几个单词,你可以像这样构造正则表达式:
(create|lorem|generate|make|fake)
正则表达式有很多种可能性,可以正确匹配你的示例字符串显示的内容,但如果没有对你想要匹配/不匹配的字符串进行某种澄清,我们就无法帮助进一步......
希望这有助于您了解自己拥有的东西(以及为什么它不起作用),这样您就可以开始朝着我想要的方向前进。
修改强>
根据添加到问题中的新信息,这里的正则表达式将匹配“create
,lorem
,generate
,make
或fake
中的任意一个,后跟行终止符($
)或后跟0-3位的空格。不匹配页面或数字后面的任何内容。如果你想要它建议您修改正则表达式以明确捕获您的单词,而不是使用[^s\s]
字符类。
(create|lorem|generate|make|fake)(\s[0-9]{0,3}|$)
匹配
"create 10 pages"
"create 10"
"create "
"create"
但不是:
"createX"
请参阅example