正则表达式 - 在javascript中,如果一个组以某个字符串开头,则不匹配

5

我正在处理一些在JavaScript中使用正则表达式的问题,由于其不支持典型的回顾后发选项,因此我需要只匹配未以某个字符串开头的组:

(^|)(www\.[\S]+?(?= |[,;:!?]|\.( )|$))

因此,在接下来的内容中

hello http:/www.mytestwebsite.com is awesome

我正在尝试检测www.mytestwebsite.com是否前面有


/

如果是这样,我不想匹配,否则就匹配。我尝试使用向前查看,但它似乎与我已经有的向前查看冲突。

我一直在尝试在不同的位置放置(?!&#x2f),但没有成功。

(^|)((?!&#x2f)www\.[\S]+?(?= |[,;:!?]|\.( )|$))

一个向前查看,如果匹配前面存在的话,则不会发生匹配。

你尝试过使用 (^|/|)(www\.[\S]+?(?= |[,;:!?]|\.( )|$)) 吗? - jperezov
@jperezov 在匹配中包含 &#x2fl 值。 - jonfriesen
你可以只进行两次匹配。 - miken32
糟糕,我误读了你的内容。如果你想要排除它,只需将其包裹在 [^] 中,像这样:(^|[^/]|)(www\.[\S]+?(?= |[,;:!?]|\.( )|$)) - jperezov
@jperezov,那也不起作用。我认为 [ ] 括号正在对其中的每个单独字符进行比较。我尝试过 (^|^(/)|)(www\.[\S]+?(?= |[,;:!?]|\.( )|$)),它包括了 / 作为一个匹配项。https://regex101.com/r/eZ1gT7/244 - jonfriesen
2个回答

3
由于JS中缺乏“回顾后发”,实现您的目标的唯一方法是匹配那些包含错误/的网站。
这是因为前瞻不会推进当前位置,只有对可消耗文本的匹配才能推进位置。
但是,一个好的解决方法始终是将错误文本作为选项包含在正则表达式中。您可以在其周围放置一些捕获组,然后测试该组是否匹配。如果匹配,则跳过并继续下一个匹配。
这需要坐在while循环中检查每个成功的匹配。在下面的正则表达式中,如果第1组匹配,则不存储第2组URL,如果没有,则存储第2组URL。

(/)?(www\.\S+?(?= |[,;:!?]|\.( )|$))

 ( &\#x2f; )?                  # (1)
 (                             # (2 start)
      www\. \S+? 
      (?=
           &\#x20;
        |  [,;:!?] 
        |  \.
           ( &\#x20; )                   # (3)
        |  $ 
      )
 )                             # (2 end)

0

另一个选项(我没有进行任何性能测试)是使用string.replace()与正则表达式和回调作为第二个参数。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace

然后,在replace函数内部,使用回调函数传递的偏移参数(参见上面的文档),将不想匹配的非法字符添加到匹配字符串的前面/后面。您可以确定每个匹配项及其位置,并决定是否替换文本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接