【问题标题】:Capturing every repetition of group [duplicate]捕获组的每一次重复[重复]
【发布时间】:2015-02-12 19:44:11
【问题描述】:

我需要检查一个字符串是否符合以下逻辑模式:

字符串,字符串,字符串

我需要使用正则表达式,但我不能使用函数。

例如下面的字符串应该匹配:

hello,hola, ciao,bye -> [hello,hola,ciao,bye]

以下内容不应匹配:

hello -> []

我现在正在使用这个正则表达式,但它只适用于第一个字符串。 我试图在第二个示例中排除没有逗号的单个字符串。

([^,]+)

以下正则表达式也不起作用:它不应该匹配每个组,然后在行尾但在行尾之前必须存在逗号后跟字符串?

([^,]+)(?<=,)$

有什么想法吗?

【问题讨论】:

  • 你使用什么语言?
  • 不允许使用函数,语言无关紧要!然而 javascript :)
  • @DamianoBarbati:捕获工具并不是正则表达式的固有。这只是因为许多编程语言已经使大型正则表达式库方面(如捕获)得到了很好的支持。但框架因此很重要。
  • 这是错误的,语言很重要,因为语言并不总是相同的正则表达式引擎。
  • 不,更新的问题。我实际上需要一个真/假匹配

标签: javascript regex


【解决方案1】:

您必须匹配([^,]+),?,并遍历每个匹配项。正则表达式没有“数组”的概念。

或者,您可以在, 上“拆分”并完成。

【讨论】:

  • 编辑:我不太需要数组,只是正确匹配“字符串,字符串,字符串”序列而不是简单的“字符串”
  • @DamianoBarbati if (str.indexOf(',') &gt; -1) { 呢??
  • 我明白了,您需要它来释放“空间”吗?您可能无法使用单线来做到这一点。你可以先看看它是否“有逗号”,然后去掉空格。
  • 空闲空间是什么意思?
  • 我的意思是把hola, ciao变成hola,ciao(没有空格)
【解决方案2】:

以积极的眼光尝试这样做:

/\w+(?=,)/g

perl 示例:

$ echo 'hello,hola, ciao,bye' | 
    perl -lne 'my @a = /\w+(?=,)/g; print join "\n", @a'
hello
hola
ciao

或者使用split

$ echo 'hello,hola, ciao,bye' |
    perl -lne 'my @a = split /[,\s]+/g; print join "\n", @a'
hello
hola
ciao
bye

【讨论】:

  • 不错,我也在这条路上,但与上次重复不匹配
  • 我不明白:哪个应该是正确的正则表达式?还是谢谢!
【解决方案3】:

我认为您正在寻找的是:

^[^,]+(?:,[^,]+)+$

【讨论】:

  • 是的!有用!我可以请你解释一下吗? ^[^,]+ 是匹配第一个字符串,然后是匹配逗号的非捕获组,然后是不带逗号的字符串,重复直到行尾。对吗?
  • @DamianoBarbati:是的,描述很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
相关资源
最近更新 更多