【问题标题】:Different behaviour between `/REG/g` and `new RegExp()`? [duplicate]`/REG/g` 和 `new RegExp()` 之间的行为不同? [复制]
【发布时间】:2017-02-22 21:20:21
【问题描述】:

我正在尝试匹配 Rust 编译器错误输出中的组件。这是我正在使用的正则表达式:

let newErrorRegex = /(warning|error|note|help)(?:\[(.*)\])?\: (.*)\s+--> (.*):(\d+):(\d+)\n(?:((?:.+\n)+)\.+)?(?:[\d\s]+\|.*)*((?:\s+=.*)+)?/g;

它工作正常,但它太长了,所以我想把它分成多行。然后我尝试了new RegExp()

let newErrorRegex = new RegExp('(warning|error|note|help)(?:\[(.*)\])?\: (.*)\s+--> (.*):(\d+):(\d+)\n(?:((?:.+\n)+)\.+)?(?:[\d\s]+\|.*)*((?:\s+=.*)+)?', 'g');
const match = newErrorRegex.exec(output);

但是这次不行!然而,一些更简单的实例没有这样的问题,例如,

let testRegexp = new RegExp('abc', 'g');
const match = testRegexp.exec('abcabc');

/REG/gnew RegExp() 有什么区别?我该如何解决这个问题?我已经尝试过 TypeScript 1.8.7 和 2.0(虽然我不认为它是相关的......)。

任何帮助将不胜感激,谢谢!

仅供参考,Rust 编译器输出的示例可能是:https://regex101.com/r/vKFWYW/1

【问题讨论】:

    标签: javascript regex typescript


    【解决方案1】:

    在您的第一行中,您使用的语法/foo/\ 成为它们的样子。

    使用new Regex('foo'),您可以转义反斜杠,因为它是字符串文字。这导致:

    let newErrorRegex = new RegExp('(warning|error|note|help)(?:\\[(.*)\\])?\\: (.*)\\s+--> (.*):(\\d+):(\\d+)\\n(?:((?:.+\\n)+)\\.+)?(?:[\\d\\s]+\\|.*)*((?:\\s+=.*)+)?', 'g');
    

    【讨论】:

    • @Soviut 37 秒,编辑速度非常快 :)
    • 我实际上是在看着你实时添加它;)为了完整起见,你应该将带有转义斜杠的表达式的更正版本添加到你的答案中。
    • @Soviut 完成 :)
    • 感谢您的快速答复!我现在感觉自己像个菜鸟,哈哈
    • @FrederickZhang 我们都是这样学习的;)
    猜你喜欢
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 2016-10-04
    • 2015-07-01
    • 2013-12-20
    • 1970-01-01
    相关资源
    最近更新 更多