Javascript 的奇怪 RegEx 请求

Posted

技术标签:

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

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

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

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

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

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

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

【问题讨论】:

【参考方案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;
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^

【讨论】:

我添加了更多的“示例文本”,您的想法几乎可行,但并非总是如此:regex101.com/r/T4cDOL/5 我认为您还应该处理匹配到字符串/行末尾的情况。 @SusanSuzy - 请update your quesiton 将回答问题所需的所有信息放入问题中,而不仅仅是链接。一定要显示应该匹配的内容。两个原因:人们不应该去场外帮助你;和链接腐烂,使问题及其答案对未来的人们毫无用处。请在问题中添加minimal reproducible example in。更多:How do I ask a good question?Something in my web site or project doesn't work. Can I just paste a link to it? @NiettheDarkAbsol - 不错的主意,我会将\r\n 添加到角色类中。 regex101.com/r/T4cDOL/6 -- 似乎某些“路径”可能将\n 作为子字符串,因此该标记并不总是作为分隔符。整个事情都很尴尬XD

以上是关于Javascript 的奇怪 RegEx 请求的主要内容,如果未能解决你的问题,请参考以下文章

javascript ajax 调用通过仅使用 POST 方法的 fetch 调用:奇怪的行为是 post 后跟 get plus 再次请求所有资源?

如何在javascript中访问请求查询字符串参数?

预编译

Javascript + Regex = 没有重复的错误?

从 JavaScript 访问 WCF WebService - 对预检请求的响应未通过访问控制检查

Google Vision API 文本检测奇怪行为 - Javascript