日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java - 正则表达式的运用(Pattern模式和Matcher匹配)

發布時間:2025/3/21 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java - 正则表达式的运用(Pattern模式和Matcher匹配) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、緒論:?? ? ??

在寫程序的過程中,有時會需要匹配、查找、替換或者是判斷字符串的出現情況,而且有時不能用簡單的純編碼方式解決這些問題,這個時候就會想到要正則表達式,無論是Java, PHH, C#, ?Python, ?JavaScript, ActionScript, Perl等語言,都提高了強大的正則表達式支持,有的語言的精華就在于字符串處理功能比如Perl。

? ? ? ?

在Java中,正則表達式也是Java處理字符串,文本的重要工具。

Java對正則表達式的處理集中在以下兩個類: java.util.regex.Pattern ? 模式類:用來表示一個編譯過的正則表達式。 java.util.regex.Matcher ? 匹配類:用模式匹配一個字符串所得到的結果。 二、先看一個簡單的例子: 需求:從字符串:{"_type":"FQDN","_oid":"51a867e4773da1128b1422ad"} 中取出這段數字:51a867e4773da1128b1422ad 沒有用過正則表達式的程序員可能分為兩步獲取 1. 用String類的indexOf方法獲取51a867e4773da1128b1422ad的初始位置 2. 用String類的subString方法取出51a867e4773da1128b1422ad 用這種方法的缺點是代碼可閱讀性很差,即我們常說的hard code 如果用正則表達式則可以用以下的方法: String reg = "[0-9A-Za-z]{24,}"; // appear at least 24 times ^[0-9A-Za-z]{24,} Pattern pattern = Pattern.compile(reg); Matcher matcher = pattern.matcher(str); if (matcher.find()) {// matcher.matchers() { String fqdnId = matcher.group(); } 三、一些常見的問題 1.??鎖定模式的應用范圍的?^ 和 $ 。他們是分別用來匹配字符串的開始和結束。

? ? ? ? ?"^wangsheng":?開頭一定要有"wangsheng"的字符串才能被匹配;

   ?"isJoshWang$":?結尾一定要由"isJoshWang" 的字符串來結尾;

那么,

  ? "^abc$": 就是要求以abc開頭和以abc結尾的字符串,實際上是只有abc匹配。

?

  ? "notice": 匹配包含notice的字符串。

用這兩個字符就將模式鎖定在一定范圍里面。

?

2. Java對反斜線的處理問題:

在其他語言中,\\表示要插入一個字符\;

?在Java語言中,\\表示要插入正則表達式的反斜線,并且后面的字符有特殊意義。

在Java正則表達式中,如果要插入一個\字符,則需要在正則表達式中寫成\\\\,原因是APIDoc定義\\表示一個反斜線。 但是如果在正則表示式中表示回車換行等,則不需要多添加反斜線了。比如回車\r就寫作\r. 3. 常用的與正則表達式相關的API 1) Matcher.find():嘗試查找與模式匹配的字符序列的下一個子序列。此方法從字符序列的開頭開始,如果該方法的前一次調用成功了并且從那時開始匹配器沒有被重置,則從以前匹配操作沒有匹配到的第一個字符開始,即如果前一次找到與模式匹配的子序列則這次從這個子序列后開始查找。 2)?Matcher.matchers():判斷整個字符序列與模式是否匹配。 當連續用Matcher對象檢查多個字符串時候,可以使用Matcher.reset()重置匹配器,放棄其所有顯式狀態信息并將其添加位置設置為零。或者Matcher.reset(CharSequence input)? 重置此具有新輸入序列的匹配器來重復使用匹配器。 3) 組的概念,這個概念很重要,組是用括號劃分的正則表達式,可以通過編號來引用組。組號從0開始,有幾對小括號就表示有幾個組,并且組可以嵌套,組號為0的表示整個表達式,組號為1的表示第一個組,依此類推。 例如:A(B)C(D)E正則式中有三組,組0是ABCDE,組1是B,組2是D; A((B)C)(D)E正則式中有四組:組0是ABCDE,組1是BC,組2是B;組3是C,組4是D。 int groupCount():返回匹配其模式中組的數目,不包括第0組。 String group():返回前一次匹配操作(如find())的第0組。 String group(int group):返回前一次匹配操作期間指定的組所匹配的子序列。如果該匹配成功,但指定的組未能匹配字符序列的任何部分,則返回 null。 int start(int group):返回前一次匹配操作期間指定的組所匹配的子序列的初始索引。 int end(int group):返回前一次匹配操作期間指定的組所匹配的子序列的最后索引+1。 4)匹配的范圍的控制 最變態的就要算lookingAt()方法了,名字很讓人迷惑,需要認真看APIDoc。 start()? 返回以前匹配的初始索引。 end()? 返回最后匹配字符之后的偏移量。 public boolean lookingAt()嘗試將從區域開頭開始的輸入序列與該模式匹配。 與 matches 方法類似,此方法始終從區域的開頭開始;與之不同的是,它不需要匹配整個區域。 如果匹配成功,則可以通過 start、end 和 group 方法獲取更多信息。 返回:當且僅當輸入序列的前綴匹配此匹配器的模式時才返回 true。 ?5)?Pattern標記 Pattern類的靜態方法 static Pattern compile(String regex, int flags) 將給定的正則表達式編譯到具有給定標志的模式中。 其中的flags參數就是Pattern標記,這個標記在某些時候非常重要。 Pattern.CANON_EQ 啟用規范等價。 Pattern.CASE_INSENSITIVE 啟用不區分大小寫的匹配。 Pattern.COMMENTS 模式中允許空白和注釋。 Pattern.DOTALL 啟用 dotall 模式。 Pattern.LITERAL 啟用模式的字面值分析。 Pattern.MULTILINE 啟用多行模式。 Pattern.UNICODE_CASE 啟用 Unicode 感知的大小寫折疊。 Pattern.UNIX_LINES 啟用 Unix 行模式。? ?4. 字符串的替換 String.replace(char oldChar, char newChar) 返回一個新的字符串,它是通過用 newChar 替換此字符串中出現的所有 oldChar 而生成的。 String.replace(CharSequence target, CharSequence replacement) 使用指定的字面值替換序列替換此字符串匹配字面值目標序列的每個子字符串。 String.replaceAll(String regex, String replacement) 使用給定的 replacement 字符串替換此字符串匹配給定的正則表達式的每個子字符串。 String.replaceFirst(String regex, String replacement) 使用給定的 replacement 字符串替換此字符串匹配給定的正則表達式的第一個子字符串。 StringBuffer.replace(int start, int end, String str) 使用給定 String 中的字符替換此序列的子字符串中的字符。 StringBuilder.replace(int, int, java.lang.String) 使用給定 String 中的字符替換此序列的子字符串中的字符。 Matcher.replaceAll(String replacement) 替換模式與給定替換字符串相匹配的輸入序列的每個子序列。 Matcher.replaceFirst(String replacement) 替換模式與給定替換字符串匹配的輸入序列的第一個子序列。? 5、 字符串的切分 String[] split(String regex) 根據給定的正則表達式的匹配來拆分此字符串。 String[] split(String regex, int limit) 根據匹配給定的正則表達式來拆分此字符串。 當然,還有一個StringTokenizer類,可以用來切分字符串,但是現在SUN已經不推薦使用了。轉變下思路,其實用正則表達式也可以達到將字符串切分為段的目的。 6.?正則表達式最大的難點在于熟練書寫正則表達式: 構造 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?匹配
字符?字符類?預定義字符類?POSIX 字符類(僅 US-ASCII)?java.lang.Character 類(簡單的?java 字符類型)?Unicode 塊和類別的類?邊界匹配器?Greedy 數量詞?Reluctant 數量詞?Possessive 數量詞?Logical 運算符?Back 引用?引用?特殊構造(非捕獲)
x字符?x
\\反斜線字符
\0n帶有八進制值?0?的字符?n?(0?<=?n?<=?7)
\0nn帶有八進制值?0?的字符?nn?(0?<=?n?<=?7)
\0mnn帶有八進制值?0?的字符?mnn(0?<=?m?<=?3、0?<=?n?<=?7)
\xhh帶有十六進制值?0x?的字符?hh
\uhhhh帶有十六進制值?0x?的字符?hhhh
\t制表符 ('\u0009')
\n新行(換行)符 ('\u000A')
\r回車符 ('\u000D')
\f換頁符 ('\u000C')
\a報警 (bell) 符 ('\u0007')
\e轉義符 ('\u001B')
\cx對應于?x?的控制符
[abc]a、b?或?c(簡單類)
[^abc]任何字符,除了?a、b?或?c(否定)
[a-zA-Z]a?到?z?或?A?到?Z,兩頭的字母包括在內(范圍)
[a-d[m-p]]a?到?d?或?m?到?p:[a-dm-p](并集)
[a-z&&[def]]d、e?或?f(交集)
[a-z&&[^bc]]a?到?z,除了?b?和?c:[ad-z](減去)
[a-z&&[^m-p]]a?到?z,而非?m?到?p:[a-lq-z](減去)
.任何字符(與行結束符可能匹配也可能不匹配)
\d數字:[0-9]
\D非數字:?[^0-9]
\s空白字符:[ \t\n\x0B\f\r]
\S非空白字符:[^\s]
\w單詞字符:[a-zA-Z_0-9]
\W非單詞字符:[^\w]
\p{Lower}小寫字母字符:[a-z]
\p{Upper}大寫字母字符:[A-Z]
\p{ASCII}所有 ASCII:[\x00-\x7F]
\p{Alpha}字母字符:[\p{Lower}\p{Upper}]
\p{Digit}十進制數字:[0-9]
\p{Alnum}字母數字字符:[\p{Alpha}\p{Digit}]
\p{Punct}標點符號:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph}可見字符:[\p{Alnum}\p{Punct}]
\p{Print}可打印字符:[\p{Graph}\x20]
\p{Blank}空格或制表符:[ \t]
\p{Cntrl}控制字符:[\x00-\x1F\x7F]
\p{XDigit}十六進制數字:[0-9a-fA-F]
\p{Space}空白字符:[ \t\n\x0B\f\r]
\p{javaLowerCase}等效于 java.lang.Character.isLowerCase()
\p{javaUpperCase}等效于 java.lang.Character.isUpperCase()
\p{javaWhitespace}等效于 java.lang.Character.isWhitespace()
\p{javaMirrored}等效于 java.lang.Character.isMirrored()
\p{InGreek}Greek?塊(簡單塊)中的字符
\p{Lu}大寫字母(簡單類別)
\p{Sc}貨幣符號
\P{InGreek}所有字符,Greek 塊中的除外(否定)
[\p{L}&&[^\p{Lu}]]?所有字母,大寫字母除外(減去)
^行的開頭
$行的結尾
\b單詞邊界
\B非單詞邊界
\A輸入的開頭
\G上一個匹配的結尾
\Z輸入的結尾,僅用于最后的結束符(如果有的話)
\z輸入的結尾
X?X,一次或一次也沒有
X*X,零次或多次
X+X,一次或多次
X{n}X,恰好?n?次
X{n,}X,至少?n?次
X{n,m}X,至少?n?次,但是不超過?m?次
X??X,一次或一次也沒有
X*?X,零次或多次
X+?X,一次或多次
X{n}?X,恰好?n?次
X{n,}?X,至少?n?次
X{n,m}?X,至少?n?次,但是不超過?m?次
X?+X,一次或一次也沒有
X*+X,零次或多次
X++X,一次或多次
X{n}+X,恰好?n?次
X{n,}+X,至少?n?次
X{n,m}+X,至少?n?次,但是不超過?m?次
XYX?后跟?Y
X|YX?或?Y
(X)X,作為捕獲組
\n任何匹配的?nth捕獲組
\Nothing,但是引用以下字符
\QNothing,但是引用所有字符,直到?\E
\ENothing,但是結束從?\Q?開始的引用
(?:X)X,作為非捕獲組
(?idmsux-idmsux)?Nothing,但是將匹配標志i?d?m?s?u?x?on - off
(?idmsux-idmsux:X)??X,作為帶有給定標志?i?d?m?s?u?x?on - off
(?=X)X,通過零寬度的正 lookahead
(?!X)X,通過零寬度的負 lookahead
(?<=X)X,通過零寬度的正 lookbehind
(?<!X)X,通過零寬度的負 lookbehind
(?>X)X,作為獨立的非捕獲組

反斜線、轉義和引用

反斜線字符 ('\') 用于引用轉義構造,如上表所定義的,同時還用于引用其他將被解釋為非轉義構造的字符。因此,表達式?\\?與單個反斜線匹配,而?\{?與左括號匹配。

在不表示轉義構造的任何字母字符前使用反斜線都是錯誤的;它們是為將來擴展正則表達式語言保留的。可以在非字母字符前使用反斜線,不管該字符是否非轉義構造的一部分。

根據?Java Language Specification?的要求,Java 源代碼的字符串中的反斜線被解釋為?Unicode 轉義或其他字符轉義。因此必須在字符串字面值中使用兩個反斜線,表示正則表達式受到保護,不被 Java 字節碼編譯器解釋。例如,當解釋為正則表達式時,字符串字面值?"\b"?與單個退格字符匹配,而?"\\b"?與單詞邊界匹配。字符串字面值?"\(hello\)"?是非法的,將導致編譯時錯誤;要與字符串?(hello)?匹配,必須使用字符串字面值?"\\(hello\\)"。

字符類

字符類可以出現在其他字符類中,并且可以包含并集運算符(隱式)和交集運算符 (&&)。并集運算符表示至少包含其某個操作數類中所有字符的類。交集運算符表示包含同時位于其兩個操作數類中所有字符的類。

字符類運算符的優先級如下所示,按從最高到最低的順序排列:

1???? 2???? 3???? 4???? 5????
字面值轉義????\x
分組[...]
范圍a-z
并集[a-e][i-u]
交集[a-z&&[aeiou]]

注意,元字符的不同集合實際上位于字符類的內部,而非字符類的外部。例如,正則表達式?.?在字符類內部就失去了其特殊意義,而表達式?-?變成了形成元字符的范圍。

行結束符

行結束符?是一個或兩個字符的序列,標記輸入字符序列的行結尾。以下代碼被識別為行結束符:

  • 新行(換行)符 ('\n')、
  • 后面緊跟新行符的回車符 ("\r\n")、
  • 單獨的回車符 ('\r')、
  • 下一行字符 ('\u0085')、
  • 行分隔符 ('\u2028') 或
  • 段落分隔符 ('\u2029)。

如果激活?UNIX_LINES?模式,則新行符是唯一識別的行結束符。

如果未指定?DOTALL?標志,則正則表達式?.?可以與任何字符(行結束符除外)匹配。

默認情況下,正則表達式?^?和?$?忽略行結束符,僅分別與整個輸入序列的開頭和結尾匹配。如果激活?MULTILINE?模式,則?^?在輸入的開頭和行結束符之后(輸入的結尾)才發生匹配。處于?MULTILINE?模式中時,$?僅在行結束符之前或輸入序列的結尾處匹配。

組和捕獲

捕獲組可以通過從左到右計算其開括號來編號。例如,在表達式?((A)(B(C)))?中,存在四個這樣的組:

1???? 2???? 3???? 4????
((A)(B(C)))
\A
(B(C))
(C)

組零始終代表整個表達式。

之所以這樣命名捕獲組是因為在匹配中,保存了與這些組匹配的輸入序列的每個子序列。捕獲的子序列稍后可以通過 Back 引用在表達式中使用,也可以在匹配操作完成后從匹配器獲取。

與組關聯的捕獲輸入始終是與組最近匹配的子序列。如果由于量化的緣故再次計算了組,則在第二次計算失敗時將保留其以前捕獲的值(如果有的話)例如,將字符串?"aba"?與表達式?(a(b)?)+?相匹配,會將第二組設置為?"b"。在每個匹配的開頭,所有捕獲的輸入都會被丟棄。

以?(?)?開頭的組是純的非捕獲?組,它不捕獲文本,也不針對組合計進行計數。

Unicode 支持

此類符合?Unicode Technical Standard #18:Unicode Regular Expression Guidelines?第 1 級和 RL2.1 Canonical Equivalents。

Java 源代碼中的 Unicode 轉義序列(如?\u2014)是按照 Java Language Specification 的?第 3.3 節中的描述處理的。這樣的轉義序列還可以由正則表達式解析器直接實現,以便在從文件或鍵盤擊鍵讀取的表達式中使用 Unicode 轉義。因此,可以將不相等的字符串?"\u2014"?和?"\\u2014"?編譯為相同的模式,從而與帶有十六進制值?0x2014?的字符匹配。

與 Perl 中一樣,Unicode 塊和類別是使用?\p?和?\P?構造編寫的。如果輸入具有屬性?prop,則與?\p{prop}?匹配,而輸入具有該屬性時與?\P{prop}?不匹配。塊使用前綴?In?指定,與在?InMongolian?中一樣??梢允褂每蛇x前綴?Is?指定類別:\p{L}?和?\p{IsL}?都表示 Unicode 字母的類別。塊和類別在字符類的內部和外部都可以使用。

受支持的類別是由?Character?類指定版本中的?The Unicode Standard?的類別。類別名稱是在 Standard 中定義的,即標準又豐富。Pattern?所支持的塊名稱是?UnicodeBlock.forName?所接受和定義的有效塊名稱。

行為類似 java.lang.Character boolean 是?methodname?方法(廢棄的類別除外)的類別,可以通過相同的?\p{prop}?語法來提供,其中指定的屬性具有名稱?javamethodname。

與 Perl 5 相比較

Pattern?引擎用有序替換項執行傳統上基于 NFA 的匹配,與 Perl 5 中進行的相同。

此類不支持 Perl 構造:

  • 條件構造?(?{X})?和?(?(condition)X|Y)、

  • 嵌入式代碼構造?(?{code})?和?(??{code})、

  • 嵌入式注釋語法?(?#comment)?和

  • 預處理操作?\l?\u、\L?和?\U。

此類支持但 Perl 不支持的構造:

  • Possessive 數量詞,它可以盡可能多地進行匹配,即使這樣做導致所有匹配都成功時也如此。

  • 字符類并集和交集,如上文所述。

與 Perl 的顯著不同點是:

  • 在 Perl 中,\1?到?\9?始終被解釋為 Back 引用;如果至少存在多個子表達式,則大于?9?的反斜線轉義數按 Back 引用對待,否則在可能的情況下,它將被解釋為八進制轉義。在此類中,八進制轉義必須始終以零開頭。在此類中,\1?到?\9?始終被解釋為 Back 引用,較大的數被接受為 Back 引用,如果在正則表達式中至少存在多個子表達式的話;否則,解析器將刪除數字,直到該數小于等于組的現有數或者其為一個數字。

  • Perl 使用?g?標志請求恢復最后匹配丟失的匹配。此功能是由?Matcher?類顯式提供的:重復執行?find?方法調用可以恢復丟失的最后匹配,除非匹配器被重置。

  • 在 Perl 中,位于表達式頂級的嵌入式標記對整個表達式都有影響。在此類中,嵌入式標志始終在它們出現的時候才起作用,不管它們位于頂級還是組中;在后一種情況下,與在 Perl 中類似,標志在組的結尾處還原。

  • Perl 允許錯誤匹配構造,如在表達式?*a?中,以及不匹配的括號,如在在表達式?abc]?中,并將其作為字面值對待。此類還接受不匹配的括號,但對 +、? 和 * 不匹配元字符有嚴格限制;如果遇到它們,則拋出?PatternSyntaxException。

有關正則表達式構造行為更準確的描述,請參見?Mastering Regular Expressions, 2nd Edition,該書由 Jeffrey E. F. Friedl、O'Reilly 和 Associates 合著,于 2002 年出版。


from:?http://josh-persistence.iteye.com/blog/1881270

總結

以上是生活随笔為你收集整理的Java - 正则表达式的运用(Pattern模式和Matcher匹配)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 在线播放精品视频 | 全黄一级片 | 制服丝袜av电影 | 五月婷婷小说 | 久久大香焦 | 奇米狠狠 | 国产亚洲精品久久久久婷婷瑜伽 | 欧美精品性视频 | 日韩av网址在线观看 | 四虎永久在线精品免费网址 | www.亚洲| 久久精品99国产 | 尤物91| 夜夜导航 | 国产视频你懂的 | 青青草国产在线视频 | jzzijzzij亚洲成熟少妇18 欧美www在线观看 | 麻豆乱码国产一区二区三区 | 大j8福利视频导航 | 欧美日韩国产三级 | 无码日韩精品一区二区 | 天堂中文资源在线观看 | 国产免费内射又粗又爽密桃视频 | 丰满肥臀噗嗤啊x99av | 亚洲女人被黑人巨大进入 | 国产真实乱 | 日本色视频 | 国产精品久久久久久中文字 | av小说在线观看 | xxx日本少妇| 五月天av影院 | 欧美成人高潮一二区在线看 | 欧美xxxx在线| 色老头在线视频 | 欧美美女色图 | 亚洲天堂国产 | 亚洲女人被黑人巨大进入 | 香蕉一级视频 | 涩涩屋污 | 老妇高潮潮喷到猛进猛出 | 色悠悠在线视频 | 国产超碰在线观看 | 在线综合网 | 一卡二卡三卡四卡 | 亚洲av无码专区在线 | 国产激情第一页 | 欧美亚洲成人网 | 久久久亚洲成人 | free性护士vidos猛交 | 国产aa大片 | 瑟瑟视频免费看 | 中文字幕永久在线视频 | 精品欧美乱码久久久久久 | 玖玖爱这里只有精品 | 日本精品视频一区 | 日韩黄色片子 | 国产男男gay | 北京富婆泄欲对白 | 免费看欧美一级特黄a大片 国产免费的av | 国产吃瓜黑料一区二区 | 靠逼动漫 | av在线播放网站 | 日批视频 | 狠狠操网址 | 午夜理伦三级理论 | 精品影视一区二区 | 久久午夜无码鲁丝片 | 男人插入女人下面的视频 | 后入内射欧美99二区视频 | 成人激情五月天 | 中国少妇毛片 | 少妇大叫太粗太大爽一区二区 | 伊人99| 国产老熟女伦老熟妇露脸 | 日本免费高清一区二区 | 精东av在线 | jizz国产在线观看 | 日韩二区在线 | 男人靠女人免费视频网站 | 日本在线免费观看视频 | 国产精品综合一区二区 | 日本理论片中文字幕 | 亚洲国产成人精品激情在线 | 两口子交换真实刺激高潮 | 粉嫩久久99精品久久久久久夜 | 巨物撞击尤物少妇呻吟 | 亚洲色在线视频 | 中文字幕5566 | 免费观看成人av | 在线观看9.1 | 一区二区三区不卡视频在线观看 | 男生操女生在线观看 | 米奇av| 日本动漫艳母 | 91久色蝌蚪 | 99干99| 午夜爱爱毛片xxxx视频免费看 | 成人深夜福利在线观看 | 草av在线|