簡體   English   中英

正則表達式,字母使用偶數/奇數次

[英]Regular expression, letter used even/odd-numbered times

Thread的標題可能有點誤導,但是我沒有找到更好的命名方式。 我想找到一種使用正則表達式來查找僅包含字母x和y的單詞的方法,但是x必須使用偶數次,而y必須使用奇數次。

我會用兩個正則表達式來做到這一點。

這個檢查x是否存在偶數(至少兩個):

/^(y*xy*x)+y*$/

然后檢查是否存在奇數個y(至少一個):

/^(x*yx*y)*x*yx*$/

兩者都將僅匹配僅由x和y組成的字符串。

我已經在編輯器中對此進行了測試:

(?=([^x]*x[^x]*x[^x]*)*)(?=([^y]*y[^y]*y[^y]*)*[^y]*y[^y]*)

這將找到子字符串,因此您可能需要添加空格,行首,行尾字符:

[^\s](?=([^x]*x[^x]*x[^x]*)*)(?=([^y]*y[^y]*y[^y]*)*[^y]*y[^y]*)[$\s]

為了解決這個問題, [^x]*x[^x]*x[^x]*將搶占所有非x的對象,直到找到第一個x,然后搶占所有非x的對象,直到找到第二個x,然后再次抓取其他所有內容,直到另一個x。 它包含在()*中,因此可以無限次重復,以便找到所有x對。 如果剩下一個奇數x(奇數x),則正則表達式將無法匹配該單個x。 類似地,對於y情況,它匹配所有對y,然后確保剩下一個y,然后是所有非y。 我使用?=使其匹配但不捕獲,因此我們可以檢查x,然后在同一字符串中檢查y。

這是一個經過測試的JavaScript示例函數,實現了一個滿足您要求的正則表達式。 我假設零是可接受的X數(偶數)。 正則表達式記錄在多行注釋中。

function has_even_X_odd_Y_word(text) {
/*#!(?#!js\/i re_even_x_odd_y Rev:20170125_2100)
    # Match word having even count of X and odd count of Y.
    \b       # Anchor to start of word.
    # First assert odd, non-zero count of Ys in this word.
    (?=      # Assert odd count of Y.
      (?:    # Zero or more or more Y pairs.
        x*y  # Optional Xs preceeding 1st Y.
        x*y  # Optional Xs preceeding 2nd Y.
      )*     # End zero or more Y pairs.
      x*yx*  # Optional Xs around last (odd) Y.
      \b     # Anchor to end of word.
    )        # End assert odd count of Y.
    # Match even number of Xs (can be zero = even).
    (?:      # Zero or more X pairs.
      y*x    # Optional Ys preceeding 1st X.
      y*x    # Optional Ys preceeding 2nd X.
    )*       # End zero or more X pairs.
    y*       # Optional Ys after last (even) X.
    \b       # Anchor to end of word.
!#*/
    var re_even_x_odd_y = /\b(?=(?:x*yx*y)*x*yx*\b)(?:y*xy*x)*y*\b/i;
    if (re_even_x_odd_y.test(text)) { return true; }
    return false;
} // End has_even_X_odd_Y_word().

如果在傳遞的文本中找到匹配的單詞,則該函數返回true,否則返回false。

暫無
暫無

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

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