【问题标题】:Odd RegEx request for JavascriptJavascript 的奇怪 RegEx 请求
【发布时间】:2020-11-04 00:38:53
【问题描述】:

我在使用某个 RegEx 替换字符串以供以后在 Javascript 中使用时遇到问题。

我们有相当多的文本以非常奇怪的格式存储,我们不允许修复。 但我们确实需要在其中找到所有“网络路径”字符串,遵循以下规则:

A.匹配总是以 2 个反斜杠开头。
B. 匹配字符应在第一次出现以下任何一个时立即停止:

  1. 一个
  2. 一个空间
  3. 换行
  4. 回车
  5. 一个 & 字符
  6. 文字“\r”或“\n”字符串(但仅当出现在行尾时)

我们“几乎”让它与/\\\\[^ &<\s]*/gi 一起工作,如此 RegEx 测试器页面所示: https://regex101.com/r/T4cDOL/5

即使我们让它工作起来,RegEx 也必须进一步“逃脱”才能使用 我们的 Javascript 代码,但这也没有按预期工作。

【问题讨论】:

    标签: javascript regexp-replace


    【解决方案1】:

    从您的示例中,您似乎确实有一个反斜杠,后跟一个 n 和一个反斜杠,后跟一个 r(与换行符或回车相反),这意味着您不能只使用否定字符类(因为您需要处理两个字符的序列)。我会使用积极的前瞻来知道在哪里停止,所以我可以对那部分使用交替。

    你还没有说这些字符串的哪些部分应该匹配,所以我不得不猜测一下,但这是我最好的猜测(来自Niet the Dark Absol 的有用输入):

    const rex = /\\\\.*?(?=[ &<\r\n]|\\[rn](?:$| ))/gmi;
    

    也就是说:

    • 匹配以\\开头
    • 在前瞻之前采取一切措施(非贪婪)
    • 前瞻:交替:
      • 空格、&amp;&lt;、回车(\r,字符 13)或换行符(\n,字符 10);
      • 反斜杠后跟rn if 位于行尾或后跟空格(因此我们得到\nancy 而不是\n 之后它)。

    Updated regex101

    您可能希望在\r/\n 之后添加更多字符,而不仅仅是一个空格。如果是这样,请将其设为字符类(和/或使用\s 表示“空白”,如果适用):

    const rex = /\\\\.*?(?=[ &<\r\n]|\\[rn](?:$|[ others]))/gmi;
    // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 2017-09-01
    • 2017-09-17
    • 2013-05-16
    • 2020-05-07
    • 2011-11-27
    • 2017-09-04
    相关资源
    最近更新 更多