簡體   English   中英

正則表達式檢查集合的第一個和最后一個字符是否不同

[英]Regex expression to check if first and last char of set are different

假設我有一串只有ab的字符串,如下所示:

aaabbbbababab

如何構造一個正則表達式,僅當第二個和最后一個字符不同時才匹配給定的字符串?

這是我目前的嘗試,完全相反(例如,如果第二個和最后一個字符相同則匹配):

^[ab]([ab])[ab]*\1$

我正在使用正則表達式的 ECMAScript 實現。

您可以將捕獲組用於第二個字符,並且僅在與捕獲組 1 不同時匹配最后一個字符。

^[ab]([ab])[ab]*(?!\1)[ab]$
  • ^字符串開頭
  • [ab]匹配 a 或 b(請注意,您可以省略|因為它表示字符 class 中的 pipe 字符
  • ([ab])捕獲組 1 ,匹配 a 或 b
  • [ab]*可選匹配 a 或 b
  • (?!\1)負前瞻,斷言與使用反向引用\1在組 1 中捕獲的值不同
  • [ab]$匹配字符串末尾的 a 或 b

正則表達式演示

另一種選擇是在捕獲組之后立即進行斷言

^[ab]([ab])(?![ab]*\1$)[ab]*$

正則表達式演示

或者,如果支持,因為負面的后視也可能起作用。 此頁面顯示 Javascript 的兼容性和后視

^[ab]([ab])[ab]*[ab]$(?<!\1)

正則表達式演示

如果您不必驗證整個字符串是一堆ab ,那么我會 go 用於通用的東西,例如:

^.(.).*(?!\1).$
  • ^. - 從一個字符開始
  • (.) - 將第二個字符放入捕獲組
  • .* - 可選地捕獲前進的所有內容
  • (?.\1).$ - 確保最終字符與第二個字符不同

https://regex101.com/r/k47PUu/1/

只是為了替代,你可以嘗試:

^[ab]{3,}(?<!^.\1.*(.))$

查看在線演示

  • ^ - 起始線錨。
  • [ab]{3,} - 3 次以上的字面意思是“a”或“b”。
  • (?<.^.\1.*(.) - 否定后向斷言最后一個字符與第二個字符不同。
  • $ - 結束線錨。

或者,您可以嘗試負前瞻(奇怪的是,這是測試時最有效的):

^(?!.(.).*\1$)[ab]{3,}$

查看在線演示

  • ^ - 起始線錨。
  • (?..(.).*\1$) - 斷言第二個字符的負前瞻與結束行錨點之前的最后一個字符不同。
  • [ab]{3,} - 3 次以上的字面意思是“a”或“b”。
  • $ - 結束線錨。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM