【问题标题】:Lost in translation - C# regex to JavaScript regex迷失在翻译中 - C# 正则表达式到 JavaScript 正则表达式
【发布时间】:2010-05-05 11:16:36
【问题描述】:

我在将工作中的 C# 正则表达式转换为 JavaScript 的正则表达式实现时遇到了一些问题。

这是正则表达式:

([a-z]+)((\d+)([a-z]+))?,?

"water2cups,flour4cups,salt2teaspoon" 上使用时,您应该得到:

[
    ["water", "2cups", "2", "cups"]
    ["flout", "4cups", "4", "cups"]
    ["salt", "2teaspoon", "2", "teaspoon"]
]

...确实如此。在 C# 中。但不是在 JavaScript 中。

我知道不同实现之间存在一些细微差别。为了让这个表达式在 JavaScript 中工作,我缺少什么?

更新

我正在像这样使用正则表达式:

"water2cups,flour4cups,salt2teaspoon".match(/([a-z]+)((\d+)([a-z]+))?,?/g);

【问题讨论】:

  • 重新更新:如果您使用RegExp#exec 循环而不是String#match,您将获得预期的结果(请参阅我的回答)。我没有足够的 RegExp 大师来告诉你为什么。 :-)

标签: javascript regex


【解决方案1】:

创建正则表达式

您还没有展示如何您正在创建您的 Javascript 正则表达式,例如,您是否使用文字:

var rex = /([a-z]+)((\d+)([a-z]+))?,?/;

或字符串

var rex = new RegExp("([a-z]+)((\\d+)([a-z]+))?,?");

如果是后者,请注意我已经转义了反斜杠。

全球标志

默认情况下,Javascript 正则表达式不是全局的,这对您来说可能是个问题。如果您还没有 g 标志,请添加它:

var rex = /([a-z]+)((\d+)([a-z]+))?,?/g;

var rex = new RegExp("([a-z]+)((\\d+)([a-z]+))?,?", "g");

使用RegExp#exec 而不是String#match

您的编辑表明您正在使用String#match 来获取匹配数组。我不得不承认我几乎从不使用String#match(我使用RegExp#exec,如下所示。)当我将String#match 与您的正则表达式一起使用时,我得到......非常奇怪的结果因浏览器而异。使用RegExp#exec 循环不会这样做,所以我会这样做。

工作示例

此代码可以满足您的要求:

var rex, str, match, index;

rex = /([a-z]+)((\d+)([a-z]+))?,?/g;
str = "water2cups,flour4cups,salt2teaspoon";

rex.lastIndex = 0; // Workaround for bug/issue in some implementations (they cache literal regexes and don't reset the index for you)
while (match = rex.exec(str)) {
    log("Matched:");
    for (index = 0; index < match.length; ++index) {
        log("&nbsp;&nbsp;match[" + index + "]: |" + match[index] + "|");
    }
}

log 函数只是将文本附加到 div。)

我的输出是:

Matched:
  match[0]: |water2cups,|
  match[1]: |water|
  match[2]: |2cups|
  match[3]: |2|
  match[4]: |cups|
Matched:
  match[0]: |flour4cups,|
  match[1]: |flour|
  match[2]: |4cups|
  match[3]: |4|
  match[4]: |cups|
Matched:
  match[0]: |salt2teaspoon|
  match[1]: |salt|
  match[2]: |2teaspoon|
  match[3]: |2|
  match[4]: |teaspoon|

(回想一下,在 Javascript 中,match[0] 将是 整个 匹配项;然后 match[1] 等是您的捕获组。)

【讨论】:

    【解决方案2】:

    C# 具有自动转义反斜杠 () 的“@”运算符。 我不认为 Javascript 支持它,所以你基本上需要通过添加另一个反斜杠来“转义”反斜杠,所以这应该可以解决问题

    ([a-z]+)((\d+)([a-z]+))?,?
    

    【讨论】:

    • 只有在使用字符串创建正则表达式时才需要转义反斜杠,而不是在使用文字表示法时。
    猜你喜欢
    • 1970-01-01
    • 2012-01-16
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    相关资源
    最近更新 更多