我的正则表达式有一个小问题。我需要解析后面的字符串中的所有单词:
word - word2,word3,word4
试图解决,但它只返回最后一次迭代
(\w+) - ((\w+)[, ]{0,2})+
https://regex101.com/r/2Uot2M/1
感谢您的帮助。
P.S:我不能只匹配像(\ w +)这样的所有单词。我需要将字符串与上面的格式匹配。
答案 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。
(注意# 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