正則判斷內容中,不得出現多個不同結果組

2021-10-01 19:50:28 字數 1802 閱讀 8118

嗯。。。。看標題,有點迷糊,實在是文盲也形容不好這個說法

先看乙個簡單的例子,有任意長度的數字字串,判斷整個數字字串有且僅有3個數字,即:1122331122為正確,1122為錯誤,1234也為錯誤

其實,這個正則還算比較簡單,只需要有個思路一般都能寫出來

各位先按照文盲的思路來實現以下

第一步:判斷整個字串是純數字字串

^(?=[\d]+$),如果有長度要求,自行替換+符號

如果有格式要求,比如手機號,那麼就這麼寫^(?=1\d$)

好,然後問題來了,怎麼判斷是否已經有了三個不同的數字了呢?這就需要用到分組引用了

先來看看這個

^(?=[\d]+$)(\d)\1\1,這個正則的意義很明顯,即在數字字串開始,前三個是相同的數字,類似 111234、333666999這樣的,其中\1就是引用的第乙個分子(\d)

那麼,我們現在再次使用分組,找出第二個數字,正則大概如下

^(?=[\d]+$)(\d)

(?:\1*?)

((?!\1)

\d),這個也不算複雜,紅色部分為第乙個分組,也就是第乙個數字,綠色部分表示,可以有與第乙個數字相同的數字,也可以沒有,但這個相同數字不參與分組,使用?:修飾符,然後就是藍色部分,\d表示匹配乙個數字,在\d前,紫色部分進行修飾,描述這個數字不能與第乙個數字相同,這樣就找到了第二個數字

那麼,有三個不同數字組成的數字字串的驗證正則,按照以上思路就可以得到最後的正規表示式

^(?=[\d]+$)(\d)(?:\1*?)((?!\1)\d)(?:\1|\2)*((?!\1|\2)\d)(\1|\2|\3)*,好了,必有有三個數字,且只能有三個數字的正則驗證就這樣完成了

稍微調整一下^(?=[\d]+$)(\d)(?:\1*?)((?!\1)\d)?(?:\1|\2)*((?!\1|\2)\d)?(\1|\2|\3)*,在第二和第三個數字上加上長度修飾符?,那麼就可以是1到3個數字組成的數字字串了

那麼,這個表示式有沒有使用場景呢?雖然不多,但確實是有的

我們擴充套件一下,檢查一片文章,文章中可以出現以下幾組詞語,但最多使用4組,那麼就可以用上邊這個正則變形一下

比如,有片語「軍工」、「航天」、「運輸」、「探測」、「訊號」、「傳遞」、「地圖」,檢測文章內是否出現超過三個不同的片語

示例正文1:我們的產品是軍工品質,用於地圖探測訊號傳遞等領域 ,使用了5個不同的片語

示例正文2:在運輸系統中,地圖是乙個基本的引數,訊號傳輸則是重要的輔助手段,使用了三個片語

^(?:(?!軍工|航天|運輸|探測|訊號|傳遞|地圖).)*(軍工|航天|運輸|探測|訊號|傳遞|地圖)(?:(?!軍工|航天|運輸|探測|訊號|傳遞|地圖).)*((?!\1)(?:軍工|航天|運輸|探測|訊號|傳遞|地圖))(?:(?!軍工|航天|運輸|探測|訊號|傳遞|地圖).)*((?!\1|\2)(?:軍工|航天|運輸|探測|訊號|傳遞|地圖))(?:(?!軍工|航天|運輸|探測|訊號|傳遞|地圖).)*(?!.*(?!\1|\2|\3)(軍工|航天|運輸|探測|訊號|傳遞|地圖))

使用這個正則就可以進行驗證了,與上邊數字不同的地方在於,可以有非定義片語的內容出現,也就是(?:(?!軍工|航天|運輸|探測|訊號|傳遞|地圖).)*

正則判斷內容不為空 劍指offer 正規表示式匹配

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元 不包括空字元!而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 def ma...

用feof 判斷檔案時出現多讀內容的問題

昨天將自己以前做的電子通訊錄加上了檔案讀寫的功能,是的資料可以關機儲存,開機讀取。在修改的過程中出現了乙個問題就是每次開啟程式時,讀檔案內的內容總是會在最後多讀一串資料,經過上網查詢找到了問題所在。下面我先把我原來寫的錯誤的程式部分貼出 while 0 feof stream 這裡我是先用feof ...

java中如何判斷String中的內容是否為數字

判斷字串是否是整數 public static boolean isinteger string value catch numberformatexception e 判斷字串是否是浮點數 public static boolean isdouble string value catch numb...