簡體   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