匹配正则表达式没有任何OR表达式

时间:2015-01-26 19:14:25

标签: php regex

我们说我有这个正则表达式:

[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

它首先完美地完成了两个,但最后两个不被识别。

UDPATE:

我试图在create之后与"。"匹配,但这只会匹配"创建"或" createX",或创建意外匹配(即.+)。我怎么能在第一次"创建"匹配,说:

  • 匹配spacenothing,意思是"创建","创建"并且"创建10"会工作吗?

我试过这个正则表达式:

/[create|lorem|generate|make|fake][|\s] ?([0-9]{1,3})? ?([^s\s]+)?/g

我在这里更新了小提琴:http://regexr.com/3aa0c - 我希望在这4行上匹配,但如您所见,只有前三个匹配:

matches

1 个答案:

答案 0 :(得分:3)

让我们来看看你在这里有什么:

[create|lorem|generate|make|fake].\s+^\d|([1-9]{1,3}) ?([^s\s]+)?

如果我们打破你的正则表达式:

  1. |中有[]分隔的单词,归结为“[]
  2. 之间任意匹配的任何单个字符
  3. 后跟一个字符(.
  4. 后跟一个或多个空格字符(\s+
  5. 后跟一个字符串开始锚点(^
  6. 单个数字(\d
  7. - 或 - (|
  8. 1到9之间的1-3位数([1-9]{1,3}
  9. 零个或一个空格(?
  10. 最后是由一个或多个字符的捕获组,不在文字字符s的类或空格中,重复零次或一次(([^s\s]+)?
  11. 首先,为什么你的字符串匹配/不匹配:

    1. “创建5页”//工作
    2. 这是有效的,因为找到了#5和字符串page的匹配项。 5是一个前面至少有一个空格的单个数字,并形成一个字符串的开头。单词page匹配,因为这些字符不在s或空格的类中。

      1. “创建5”//作品
      2. 与上述相同,但仅适用于数字5

        1. “create”//不匹配
        2. “create”//不匹配
        3. 由于您的字符类/替换构造不正确((|) vs []),因此这些都不匹配。其次,你的字符串中间有一个开始字符串锚点,这将阻止在行开头之前出现的任何东西被匹配。

          如果你想在交替中匹配几个单词,你可以像这样构造正则表达式:

          (create|lorem|generate|make|fake)
          

          正则表达式有很多种可能性,可以正确匹配你的示例字符串显示的内容,但如果没有对你想要匹配/不匹配的字符串进行某种澄清,我们就无法帮助进一步......

          希望这有助于您了解自己拥有的东西(以及为什么它不起作用),这样您就可以开始朝着我想要的方向前进。

          修改 根据添加到问题中的新信息,这里的正则表达式将匹配“createloremgeneratemakefake中的任意一个,后跟行终止符($后跟0-3位的空格。匹配页面或数字后面的任何内容。如果你想要它建议您修改正则表达式以明确捕获您的单词,而不是使用[^s\s]字符类。

          (create|lorem|generate|make|fake)(\s[0-9]{0,3}|$)
          

          匹配

          "create 10 pages"
          "create 10"
          "create "
          "create"
          

          但不是:

          "createX"
          

          请参阅example