【问题标题】:Given regex does not match to the end给定的正则表达式与结尾不匹配
【发布时间】:2013-08-22 00:44:15
【问题描述】:

我有一个正则表达式:

^([ \t\r]*\S+){2}$

匹配name,组匹配e,在name中。

我预计不会匹配name,而是匹配name name;比如我想要\S+ 工作直到匹配为止。我可以让它工作一点点改变它:

^([ \t\r]*\S+)([ \t\r]+\S+)$

但我希望可以缩短它。

【问题讨论】:

  • 出于好奇,您使用的是哪种语言?
  • @DennisMeng 它是 Python 中的 Oniguruma 语法(Sublime Text 中的正则表达式)
  • 在这种情况下,将其标记为 python 可能会有所帮助。
  • 谢谢大家;不幸的是,我只能接受一个答案,但我想接受几个。所以,我接受了第一个,这给了我想要的:)

标签: python regex oniguruma


【解决方案1】:

+*? 不是 possessive。它们将尽可能匹配如果产生有效匹配,但如果没有,正则表达式引擎将回溯并尝试减少匹配。我不认为 Python 支持所有格量​​词。如果您不想匹配 name,则必须重新编码您的正则表达式。

【讨论】:

  • 谢谢。比如我的正则表达式语法是 Oniguruma,它有所有格运算符。我的最终代码是^([ \\t\\r]*\\S++){2}$
【解决方案2】:

您需要传递全局修饰符。我不确定您使用的是哪种编程语言,但语法通常类似于以下内容:

/$myregex/g

例如,给定以下文本:

你好亚当,你好吗?你好,莎拉,你好吗?

正则表达式 /Hello\s(.*),/g 将匹配 AdamSarah

【讨论】:

  • 不幸的是,我使用的是 Oniguruma 语法,而且我没有 g 修饰符。
【解决方案3】:

使用您的原始表达式,^([ \t\r]*\S+){2}$name 作为不同的组分别匹配,因为您没有强制(由于[ \t\r]* 中的*)在第一组之后使用空格字符。

您可以使用前瞻断言:

^([ \t\r]*\S+(?!\S)){2}$

或者你可以使用交替:

((^|\s+)\S+){2}$

【讨论】:

  • 感谢您的回复,第二个示例的工作方式与我的第二个示例相同,但我希望有一种更简单的方法。第一个示例仅在两个词相等时才有效,很抱歉造成混淆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多