正则表达式将匹配下面字符串中的重复模式?

时间:2018-01-23 23:33:58

标签: regex string

我的正则表达式有一个小问题。我需要解析后面的字符串中的所有单词:

  

word - word2,word3,word4

试图解决,但它只返回最后一次迭代

(\w+) - ((\w+)[, ]{0,2})+

https://regex101.com/r/2Uot2M/1

感谢您的帮助。

P.S:我不能只匹配像(\ w +)这样的所有单词。我需要将字符串与上面的格式匹配。

3 个答案:

答案 0 :(得分:1)

如果您只想将每个单词捕获到一个单独的捕获组中,您可以使用此正则表达式: (\w+)

这会捕获带有一个或多个单词字符(字母或数字)的所有子字符串。它将忽略空格和标点符号。在Regex 101上,它将'word','word2','word3'和'word4'捕获到不同的捕获组中

有关字词的有用链接:https://www.w3schools.com/jsref/jsref_regexp_wordchar.asp

有关量词的有用链接('+'是量词):https://docs.microsoft.com/en-us/dotnet/standard/base-types/quantifiers-in-regular-expressions

答案 1 :(得分:1)

如果您正在使用PCRE正则表达式库,并且需要在从中提取字符串之前预先验证字符串,则可以使用以下模式:

(?:\G(?!^)|^(?=\w+ - (?:\w+[, ]{0,2})+$))\W*\K\w+

请参阅regex demo

工作原理

  • (?:\G(?!^)|^(?=\w+ - (?:\w+[, ]{0,2})+$)) - 上一个匹配的结尾(\G(?!^))或(|)字符串(^)的开头,后面跟着以下模式:
    • \w+ - 1 + word chars
    • - - 用单个空格括起来的连字符
    • (?:\w+[, ]{0,2})+ - 出现1次以上:
      • \w+ - 1 + word chars
      • [, ]{0,2} - 0到2次出现空格或逗号
    • $ - 字符串结尾
  • \W* - 0+非单词字符
  • \K - 一个匹配重置运算符,用于丢弃目前与组0(整个匹配)缓冲区匹配的所有文本
  • \w+ - 1 + word chars。

答案 2 :(得分:1)

除第一个word-word外,无需验证 使用\ G锚点和分支重置,将填充数组
捕获组1中words 收集的位置。

(?|(\w+)[ ]*-[ ]*(?=\w)|(?!^)\G[ ]*,?[ ]*(\w+))

https://regex101.com/r/deZq5u/1

请注意,不需要使用拐杖的BOS或EOS锚 这将找到有效的匹配mid-string。

Formatted and tested

(注意# Optional spaces, single comma, spaces将始终匹配
空格或逗号或两者,即使是可选的,也是必需的 分隔器。这是因为\w+子句不会留下任何后果。)

 (?|                           # Branch reset
      ( \w+ )                       # (1), First word
      [ ]* - [ ]*                   # qualified with a dash,
      (?= \w )                      # then a lookahead for next word
   |                              # or,
      (?! ^ )                       # Reset \G at BOS
      \G                            # Anchor, second or more match
      [ ]* ,? [ ]*                  # Optional spaces, single comma, spaces
      ( \w+ )                       # (1), Second or more word
 )                             # End branch reset