Glass / HD / Sc1 / Good / ABC / Z / 111
類似這樣一個字符創,想匹配出第n個 "/" 和 "/" 之前的字串的話,怎么寫正則?
比如第一個是Glass,第4個是Good
uj5u.com熱心網友回復:
RegExp:^([^\/]+\/){4}變動其中的數字就是對應的 n
匹配如下圖,可以放大了看:
uj5u.com熱心網友回復:
我覺得沒必要用正則,字串分割一下就好了比如
String s = "Glass / HD / Sc1 / Good / ABC / Z / 111";
String reg = "\\s*/\\s*";
System.out.printf("%s, %s\n", s.split(reg)[0], s.split(reg)[3]); //把s分割成陣列,取第一個和第4個元素,陣列下標從0開始
uj5u.com熱心網友回復:
重新回答下,寫個完整點的,共有3個方案,方案1由我上面的答案補充而得。===============================
兼容所有正則引擎的方案1:
^(?:[^\/]+\/){0}([^\/]+)
^(?:[^\/]+\/){1}([^\/]+)
^(?:[^\/]+\/){3}([^\/]+)
^(?:[^\/]+\/){5}([^\/]+)
^(?:[^\/]+\/){6}([^\/]+)
^(?:[^\/]+\/){7}([^\/]+)花括號內的數字表示 n - 1。最右邊的圓括號匹配內容會被存入分組1中,因此你可以通過代碼獲取分組1的值,分組1的值內容如圖中文本的綠色部分:

===============================
如果你的引擎支持,可以使用方案2:
^([^\/]+\/){}(*SKIP)(?!)|[^\/]+
^([^\/]+\/){1}(*SKIP)(?!)|[^\/]+
^([^\/]+\/){3}(*SKIP)(?!)|[^\/]+以上3條正則分別表示第1部分、第2部分、第4部分。
其中的數字表示要左側要跳過的諸如“xxx/”段落個數,
如無需跳過時要留空,如:
^([^\/]+\/){}(*SKIP)(?!)|[^\/]+也等同于:
[^\/]+
匹配圖如下:

===============================
最后是支持所有引擎的方案3:
這個就比較有意思了,可以將字串先倒轉,匹配結束再倒轉回來,正則也是反著寫。
正則如下:
[^\/]+(?=(?:\/[^\/]+){0}$)
[^\/]+(?=(?:\/[^\/]+){1}$)
[^\/]+(?=(?:\/[^\/]+){3}$)
[^\/]+(?=(?:\/[^\/]+){5}$)
[^\/]+(?=(?:\/[^\/]+){6}$)
[^\/]+(?=(?:\/[^\/]+){7}$)其中數字也是表示原字串中左側要跳過的“xxx/”片段數量
匹配結果如圖:

此方案適合替換內容,只不過多了逆轉工序,但兼容性最佳,所有引擎都支持,即便需求更復雜也任由你擴展,只是不要忘了正則得按顛倒后的字串內容順序來寫。
最后以 JavaScript 和 Python 和 vba(vb6) 的代碼運行Demo作為結尾(Java 我現在沒有運行環境,所以不能示范了):


uj5u.com熱心網友回復:
還有個最容易想到,但兼容性最差、極不穩定的方案4:這個方案很多引擎都不支持,但由于突然發現最新版的 Chrome 居然對 JS 支持這樣的正則功能,所以還是把它寫出來。
正則代碼舉例如下:
(?<=^(?:[^\/]+\/){0})[^\/]+
(?<=^(?:[^\/]+\/){3})[^\/]+其中的數字含義為 n - 1。
正則引擎是從以左往右的順序為主的,所以一般即便支持也只是支持簡單的、固定好字串長度的 look-behind 行為,此例子中的 look-behind 部分正則長度是未知的。
先來看看下面用最新版 Chrome 測驗的結果:

可以看到,雖然新版 Chrome 的 JS 已經支持如上正則的功能(似乎 .NET 也支持),但效果很不佳。第一次構建正則得花費將近四分鐘,如果放到程式中,這樣的卡頓影響可是致命性災難呀。故而不建議使用此方案,其它另幾種常用語言我也測驗了都不支持,而Java我沒有環境暫時沒測驗,但細想一下這幾十年來 Java 的虛擬機那么多,可想而知未定長度的 look-behind 正則行為很大概率是不具備穩定性的。
放棄此方案吧。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/118834.html
標籤:Java SE
上一篇:關于greenfoot
下一篇:java.lang.NoClassDefFoundError: com/aventstack/extentreports/ExtentReporter
