繁体   English   中英

正则表达式:在字符串末尾匹配一个在否定集中不匹配的字符仅一定次数

[英]Regex: Match a character that is unmatched in a negated set only a certain number of times at the end of a string

在 Javascript 中,如果括号“)”在字符串末尾重复出现两次,我想匹配(即添加到结果中),如果出现一次或两次以上,则不匹配。 答案可能是从否定集合中删除括号并“以不同的方式在其他地方使用它”——因此,我尝试调整这种方法,但没有任何成功。 虽然,我的正则表达式相当大而且很棘手,所以某些正则表达式“变得无用”——从我的经验中可以看出,因为我对正则表达式没有那么丰富的经验。 所以,这是我的正则表达式:

/(?<?[a-zA-Z/]+)(https:?),\/{1?2}[a-zA-Z]\S*(?<=\){2}|(:<=[^;"'\]),,]))/g

看,我实现这一目标的努力是“成功的一步”,因为我当前的正则表达式在出现两次时匹配括号,但在出现一次时不匹配,但如果出现两次以上则继续。 举个例子:


示例 URL: https://docs.google.com/picker?protocol=gadgets [...] &nav=(("fonts"))

结果:

[...] &nav=(("fonts") - 不匹配") - 好

[...] &nav=(("fonts")) - 匹配)) - 好

[...] &nav=(("fonts"))) [...] - 匹配)))但在否定集上不包含不需要的字符 - (有点)不好

..等等...


我尝试了不同的外观和量词......“混合”和方式,并且没有比我之前编写的正则表达式取得更好的成功。

顺便说一句,我不想在正则表达式上使用开始( ^ )和结束( $ )字符——因为我在大脚本和变量脚本中使用它,因此我使用的是全局上下文; 可能我在这个陈述上是错误的,所以如果有必要请纠正我——但如果他们是必需的——因为我已经尝试过更简单的正则表达式——我不会太在意。

正如Wiktor Stribiżew所要求的,这是带有上述示例的正则表达式的预期行为:


预期成绩:

https://docs.google.com/picker?protocol=gadgets [...] &nav=(("fonts") - 应该匹配https://docs.google.com/picker?protocol=gadgets [...] &nav=(("fonts

https://docs.google.com/picker?protocol=gadgets [...] &nav=(("fonts")) - 应该匹配所有的 URL (原始 URL)

https://docs.google.com/picker?protocol=gadgets [...] &nav=(("fonts"))) - 应该匹配https://docs.google.com/picker?protocol=gadgets [...] &nav=(("fonts

看来你可以使用

(?<![a-zA-Z/])(?:https?:)?\/{1,2}[a-zA-Z]\S*(?:[^\s:"'\\)]|(?<!\))\)\)(?!\S))

或者,要考虑任何非单词字符,

(?<![a-zA-Z/])(?:https?:)?\/{1,2}[a-zA-Z]\S*(?:\b|(?<!\))\)\)(?!\S))

请参阅正则表达式演示 详情

  • (?<![a-zA-Z/]) - 如果当前位置左侧有一个字母或/则匹配失败
  • (?:https?:)? - 可选http:https:字符串
  • \/{1,2} - 一个或两个/ s
  • [a-zA-Z] - 一个字母
  • \S* - 零个或多个非空格
  • (?:\b|(?<?\))\)\)(?!\S)) - 一个单词边界或一个))字符串,前面没有另一个)并且没有直接跟非空白字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM