【问题标题】:Is this possible with a regex?这可以用正则表达式吗?
【发布时间】:2012-08-28 23:46:54
【问题描述】:

是否可以有一个匹配以下内容的正则表达式匹配器: 我需要知道是否有 any 子字符串在匹配括号的内部和外部,完全格式化为(@ ... )

匹配示例:

  • abc (@ abc )
  • abc (@ (& abc ) )
  • abc (& def (@ abc ) )
  • (& (& abc def ) (@ abc ) )
  • (& def (& abc ) (@ abc ) )

匹配示例:

  • abc
  • (@ abc )
  • abc (@ def )
  • abc (& abc)

编辑: 这是检查正则表达式的 rspec 规范。只有 2 个测试失败:

"(@abc)abc" 应该匹配

"(@abc) (@abc)" 不应该匹配

describe "regex" do

  let(:regex) { /(.+).*\(@.*\1.*\)/ }

  matches = ["abc (@ abc )", "(@ abc ) abc", "abc (@ (& abc ) )", "abc (@ (& abc ) )"]
  no_matches = ["abc", "(@ abc )", "abc def", "abc abc", "abc (& abc)", "(@ abc ) (@ abc)"]

  matches.each do |flow|
    it "should match '#{flow}'" do
      flow.should match regex
    end
  end

  no_matches.each do |flow|
    it "should not match '#{flow}'" do
      flow.should_not match regex
    end
  end

end

【问题讨论】:

  • (@@ abc) (@ abc)(abc (@ abc))(@ abc (@ abc) 呢?我想你永远不必解析这些字符串,但最好确定
  • 那么(@ abc (abc)) (@ abc)呢?

标签: regex


【解决方案1】:

尝试使用正则表达式

/(?=.*?(?<!@ )(\b\w+\b)).*\(@.*\1.*\)/

this test code

【讨论】:

    【解决方案2】:

    在我看来,正则表达式 无法满足您的要求。您的测试看起来像是在树上执行的测试,因此您需要更强大的东西,例如解析器,它确实会将您的字符串变成可以在其上运行测试的树。

    为此,请参阅 ANTLR 之类的解析器。还有其他的,但这是我们使用的最著名的之一。

    编辑:正则表达式可能无法正确匹配的示例:(@ abc) (@ abc) 不应匹配,但我没有看到可以将其与匹配的 abc (@ abc) 区分开来的正则表达式。

    【讨论】:

    • 问题中的规范没有说(@ abc) (@ abc)不应该匹配。
    • OP 编辑​​了这个问题,它不应该,因为我解释它(虽然我同意它不是很明显)
    • 无论如何,您仍然可以使用正则表达式和负前瞻来匹配它。
    【解决方案3】:

    您可以使用反向引用很容易地做到这一点:

    /(.*).*\(@ \1 \)/
    

    这里的\1 是对上面未转义括号中捕获的内容的引用。

    您的语法可能会因引擎而略有不同。 Perl、sed、vim 等在这方面都有细微的差别。例如,您可能必须转义 @:

    /(.*).*\(\@ \1 \)/
    

    或者捕获括号可能需要转义:

    /\(.*\).*(@ \1 )/
    

    在 Perl 中建议使用$1 而不是\1

    /(.*).*\(@ $1 \)/
    

    试一试,你可能会找到正确的组合。

    【讨论】:

      【解决方案4】:

      这可能会做你想要的:

      (.+).*\(@.*\1.*\)
      

      只有在(@ ...)的外部和内部都存在某个字符串时才会匹配

      【讨论】:

      • 非常感谢,它按要求工作。但是,与往常一样,我忘记了一个例子。它也应该匹配 '(@abc) abc',但这似乎不起作用。
      猜你喜欢
      • 2015-03-21
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 2017-12-27
      • 2013-06-06
      • 2015-11-28
      • 2011-10-30
      相关资源
      最近更新 更多