【问题标题】:Match repeating patterns匹配重复模式
【发布时间】:2015-09-13 18:56:47
【问题描述】:

我有一个由以下模式的重复组成的字符串

/{\s*%\s*assign\s*\w+\s*=\s*((("|').*("|'))|\d+)\s*%\s*}/

上述模式的重复可以用空格(零个或多个)和换行符(零个或多个)分隔

是否有一个正则表达式可以返回所有上述重复的数组?

我相信由于 .* 我已经包含在我的模式中,这使得事情变得不可能?

如果我的模式难以阅读,我基本上是在尝试解析一个可能具有以下值的字符串:

    {% assign some_Variable_Name1 = "http://www.some/value.come" %}
{% assign some_Variable_Name_2 = "http://www.some/value.com.jpg" %} {% assign some_Variable_Name_5 = "http://www.some/value.com.jpg" %}
{% assign some_Variable_Name_3 = 1234 %}


{% assign some_Variable_Name_7 = "http://www.s'ome'/value.com.jpg" %}

根据上面的例子,我想得到以下数组:

['{% assign some_Variable_Name1 = "http://www.some/value.come" %}',
 '{% assign some_Variable_Name_2 = "http://www.some/value.com.jpg" %}',     
 '{% assign some_Variable_Name_5 = "http://www.some/value.com.jpg" %}',
 '{% assign some_Variable_Name_3 = 1234 %}',
 '{% assign some_Variable_Name_7 = "http://www.s'ome'/value.com.jpg" %}']

【问题讨论】:

  • 您对问题的编辑(这完全改变了问题的范围)甚至没有意义,输入字符串和输出数组甚至不匹配。回滚到您的第一个修订版或发布新问题。您当前的问题无法回答。
  • 我的最新编辑绝对有意义。与我的 OP 相比,现在唯一改变的是字符串的值和它们之间的空格/换行符。我的问题在第 6 行和后续示例中明确说明,自 OP 以来就是这种情况。你很好地回答了我 80% 的问题。这并不意味着问题已经得到解答。 OP 的标题可能与我在第 6 行的问题略有不同这一事实是一种技术性,不需要提出新问题或当前答案被视为正确的答案。
  • 不要过度编辑您的问题,因为它会使现有答案无效。如果您有后续问题,请发布 问题。我已经留下了这个,因为第二个答案是在您最后一次重大编辑之后

标签: javascript regex string


【解决方案1】:

你的正则表达式基本没问题,你只需要使用惰性量词.*?,而不是贪婪量词.*.* 尽可能匹配,.*? 将匹配整个正则表达式所需的匹配,但不会更多。因此,当您将正则表达式更改为:

{\s*%\s*assign\s*\w+\s*=\s*((("|').*?("|'))|\d+)\s*%\s*}

DEMO

它应该可以按您的预期工作。

【讨论】:

  • 感谢 m.cekiera。您的正则表达式实际上只返回分配的值,而不是整个分配字符串,如我的示例所示,但这很好。由于您能够正确提取所有 5 个值,这意味着此正则表达式实际上适用于我的模式涵盖的所有情况,因此我们走在正确的道路上!我现在有一些工作要做。谢谢。
  • 如果您将它与match() 一起使用,它将在数组中为您提供预期的结果DEMO。这不是你想要的吗?您想以数组的形式获取字符串吗?
  • 啊,是的,它与匹配工作正常。感谢您的回答 m.cekiera 并感谢您保持专业 ;-)
【解决方案2】:

您可以使用.match 和贪婪的g 修饰符来返回所有匹配的字符串。在要捕获的整个内容周围添加一个捕获括号组,并使所有其他组不捕获?:

myString.match(/({\s*%\s*assign\s*\w+\s*=\s*(?:["'].*["']|\d+)\s*%\s*})/g);

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

【讨论】:

  • 您能否提供我所描述的模式,因为我从未使用过 greedy gnon catching ?:
  • @SproutCoder 刚刚注意到另一个你可以摆脱的组。答案已编辑。
  • 如果您使用我在 OP 末尾包含的test string,您会注意到在这种情况下您的正则表达式会中断。第二场比赛包括第三场比赛,但我不知道为什么。
  • @SproutCoder 它和你原来的正则表达式一样坏。问题不是关于修复正则表达式,而是关于如何捕捉模式。我还稍微清理了语法(不更改返回的结果)。如果您对正则表达式的语法有疑问,您应该发布一个新问题,而不是编辑您的旧问题。
  • 很抱歉没有在我的 OP 标题中明确说明。问题是关于修复我的正则表达式以捕捉提到的模式。
猜你喜欢
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 2011-06-12
  • 1970-01-01
相关资源
最近更新 更多