【问题标题】:Regex without middle expression repetition (axb|cxd)没有中间表达式重复的正则表达式 (axb|cxd)
【发布时间】:2012-01-06 01:31:20
【问题描述】:

我只是不断地用这个撞墙,我无法解决它。我正在尝试获得一个执行如下的正则表达式:

(axb|cxd)

除了在表达式中不重复 x (因为它确实是长编码匹配表达式)。这是针对一个大字符串进行测试的,我只需要匹配 x 即可进行字符串替换,因此可以选择零宽度的前瞻/后视。有什么想法吗?

a、b、c 和 d 相当小,因此如果表达式更容易形成,它们可以重复。

提前致谢。

【问题讨论】:

  • 什么语言?答案可能因您的正则表达式变体而异。
  • Javascript。如果它也移植到 .NET,那将很有帮助,因为它们将一起玩,但如果我现在只有 Javascript 表达式,我会很高兴。
  • @SimpleCoder 将匹配 axd 和 cxb。排除这两种情况是我没有看到的技巧。 (抱歉,评论系统只允许我在这里回复)
  • 我知道,这就是我删除答案的原因
  • 我猜想使用(a|c)x(b|d) 模式会很困难,然后做进一步检查以确保您实际上没有匹配axdcxb

标签: javascript regex lookahead


【解决方案1】:

如果您真的不想在正则表达式中重复 x,那么您将不得不应用一些手动搜索逻辑。您可以使用正则表达式搜索 x,然后根据找到它的位置查找它之前的 a 和之后的 b 或之前的 c 和之后的 d。但是,这可能比像 Gabe 的回答那样在正则表达式中重复它更有效。

例如,您可以这样做:

var re = /(a|c)x(b|d)/;
var matches = str.match(re);
if (matches) {
    // exclude axd or cxb
    if ((matches[1] + matches[2]).match(/ab|cd/)) {
        // found axb or cxd
    }
}

但是,老实说,似乎将 x 包含两次并让正则表达式引擎为您完成繁琐的工作会更容易:

if (str.match(axb|cxd)) {
    // found match
}

或者,如果将 x 放入字符串两次太麻烦,则使用 javascript 字符串数学自己构建正则表达式:

var x = "long complicated regex";
var re = new RegExp("a" + x + "b|c" + x + "d");
if (str.match(re)) {
    // found match
}

【讨论】:

    【解决方案2】:

    没有简单的方法解决它。你必须这样做:

    var x = "long, complicated regular expression";
    var re = new RegExp("a" + x + "b|c" + x + "d");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多