Javascript 借助RegExp递归捕获标识符
我正在尝试匹配以下字符串:Javascript 借助RegExp递归捕获标识符,javascript,regex,Javascript,Regex,我正在尝试匹配以下字符串: something, something, something, something, something shouldignore 所需的输出是:[某物,某物,某物,某物]。我提出了这个RegExp(^[\t]+[^\s]+),但它不适用于其他4个东西 .您可以使用它,尽管我不确定您为什么需要它(RE并不总是最佳解决方案!): 此处\1匹配捕获的任何组 .您可以使用它,尽管我不确定您为什么需要它(RE并不总是最佳解决方案!): 此处\1匹配捕获的任何组 您可以
something, something, something, something, something shouldignore
所需的输出是:[某物,某物,某物,某物]
。我提出了这个RegExp(^[\t]+[^\s]+)
,但它不适用于其他4个东西
.您可以使用它,尽管我不确定您为什么需要它(RE并不总是最佳解决方案!):
此处\1
匹配捕获的任何组
.您可以使用它,尽管我不确定您为什么需要它(RE并不总是最佳解决方案!):
此处\1
匹配捕获的任何组
您可以使用正则表达式并在末尾添加(?:,\1)*
,这样您就可以重复使用反向引用已经捕获的内容。您还可以将锚点^
移出组并将其放在开始位置
^([\t]+[^,\s]+)(?:,\1)*
您可以使用逗号拆分并修剪结果数组中的项:
const str=“something,something,something,something,something shouldignore”;
让res=str.match(/^([\t]+[^,\s]+)(?:,\1)*/)[0]
.split(“,”)
.map(x=>x.trim());
控制台日志(res)
您的正则表达式只匹配第一部分,因为您使用了一个锚点^
来断言字符串的开头,并且没有重复您已经匹配的内容
您可以使用正则表达式并在末尾添加(?:,\1)*
,这样您就可以重复使用反向引用已经捕获的内容。您还可以将锚点^
移出组并将其放在开始位置
^([\t]+[^,\s]+)(?:,\1)*
您可以使用逗号拆分并修剪结果数组中的项:
const str=“something,something,something,something,something shouldignore”;
让res=str.match(/^([\t]+[^,\s]+)(?:,\1)*/)[0]
.split(“,”)
.map(x=>x.trim());
控制台日志(res)代码>但这只会匹配一次,例如:
['something,something,something,something,something']
,我正在尝试匹配['something','something','something','something','something']
。有道理吗?@celoxxx我明白你的意思,但我不认为你能在RE中从一个捕获组获得多个匹配。如果多个匹配都匹配相同的内容,为什么需要多个匹配?这是针对使用正则表达式匹配标记的解析器的—我知道我可以更改逻辑,但我现在对这个问题很好奇。我原以为它可以通过惰性匹配来解决。但这只会匹配一次,例如:['something,something,something,something,something']
,我正在尝试匹配['something','something','something','something','something']
。有道理吗?@celoxxx我明白你的意思,但我不认为你能在RE中从一个捕获组获得多个匹配。如果多个匹配都匹配相同的内容,为什么需要多个匹配?这是针对使用正则表达式匹配标记的解析器的—我知道我可以更改逻辑,但我现在对这个问题很好奇。我认为这可以通过lazy match解决。所以你想匹配前5个单词吗?它们应该是同一个词吗?你能编辑你的问题并给出一个更现实的输入和相应预期输出的例子吗?那么你想匹配前5个单词吗?它们应该是同一个词吗?你能编辑一下你的问题,并给出一些更现实的输入和相应的预期输出的例子吗?
^[\t ]+([^,\s]+)(, \1)*