javascript - 迷失在翻译中 - C# 正则表达式到 JavaScript 正则表达式

标签 javascript regex

我在将工作中的 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);

最佳答案

创建正则表达式

您还没有展示如何您正在创建 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] 等等捕获组。)

关于javascript - 迷失在翻译中 - C# 正则表达式到 JavaScript 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2772642/

相关文章:

javascript - 调用 ajax 时在 javascript 中获取未定义

javascript - 对单行代码使用匿名函数有什么意义?

javascript - 如何在没有重定向的情况下提交 HTML 表单

javascript - 体积固定步长光线行进中的摆动

regex - 简单的 SED 命令

java - 仅匹配未转义的特殊字符的正则表达式

javascript - 如何在另一个对象中设置另一个对象 | JavaScript

regex - Hive 正则表达式序列化

javascript - Python 和 Javascript 在计算正则表达式时的区别

java - 正则表达式 : How to add list as condition to satisfy regex in java