java正则 环视_正则表达式之环视(java)
這段代碼中真正匹配到的字符串是”ld”,所謂的順序環視就是在匹配這個字符串前的那個位置。
相信大家現在應該能夠推測出逆序環視了吧。匹配的是ld后面那個位置。
環視的例子
理解了上訴環視的列子我們來解決一開始那個問題。我們可以先分析一下,需要滿足這樣的條件。左邊要是數字,右邊的數字個數是3的倍數。
接下來就是對這個條件所實現的java代碼。
String str = "12345678";
Pattern pattern= Pattern.compile("(?<=\\d)(?=(\\d{3})+$)");
Matcher matcher=pattern.matcher(str);
System.out.printf(matcher.replaceAll(","));
(?<=\\d)這個表達式滿足了左邊是數字,可以想象一下。因為逆序環視是匹配字符串右邊的位置,也就是\d右邊的位置。那不就是說明了這個位置的左邊是\d嗎。對(?=(\\d{3})+$)的理解可能有點不太容易。如果是孤立的(\\d{3})+$匹配的是從字符串末尾向左數字的個數正好是3的倍數。但是加入順序環視之后意義就不一樣了它能匹配右邊數字的個數正好是3的倍數的位置。$是關鍵,沒有了這個符號,也就意味著可以不是從最后一個數字開始匹配的。這里可以結合程序好好的想想。這樣兩個條件就都滿足了。也就能夠匹配到正確的位置了。
但是如果給的字符串不一定是純數字,可能是”12345678$”這樣的形式,上訴的正則就不管用了。在這里我再引入兩個概念就是否定順序環視(?!)和否定逆序環視(?
在(?=表達式)中,意味表達式能夠匹配右側的文本,而(?!表達式)則以為表達式不能匹配右側的文本。那么可以將正則改成
"(?<=\\d)(?=(\\d{3})+(?!\\d))"也許你認為可以將(?!\\d)改成\D,但是這兩個其實是有區別的,\D是匹配一個非數字的字符,也就是說必須匹配一個字符。如果給你的數字是"12345678"這樣就不能得到匹配了.
總結
以上是生活随笔為你收集整理的java正则 环视_正则表达式之环视(java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 8.1初始密码_MySQL8
- 下一篇: java扫描包下类_实现获取扫描指定包路