![](/img/trans.png)
[英]java regex match any string, specific string , any string, specific string and any string
[英]Regex to match any number unless it is part of a specific string
抱歉,如果這是騙子,我確實搜索過,但似乎找不到與我的查詢匹配的內容。
我在 java 中有一個替換器 function ,它運行多個正則表達式來查找和替換特定的字符串。
其中一個是查看數字,例如,如果它找到一個數字,它會在其周圍添加空間;
測試 123 > 測試 123
使用的正則表達式是“(([0-9]+)”,它用“$1”替換它
我現在遇到了一個問題,盡管在一些邊緣情況下我不需要從特定字符串中拆分數字,例如 hash 名稱。 所以我現在需要更新我的正則表達式以用空格包裝任何數字組合,除非它與特定序列匹配。
例如,我想要以下結果;
我嘗試使用否定的lookbehind來匹配md5、sha1、sha256等詞,但它似乎仍然分割數字。 我確定我做錯了一些簡單的事情......“((?!md5)(\ d +))”
所以基本規則是,在字符串中找到的任何數字都應該用空格包圍,除非它前面有單詞 sha 或 md。 如果數字和 md 或 sha 之間已經有空格,則應該保留空格。 sha 或 md 可以是字符串的開頭,或者前面有空格或 an。 下划線,但不能是較長單詞的結尾或單詞的中間。
謝謝
以下正則表達式似乎正在工作:
(?<=\d)(?=\D)|(?<=\D)(?<!sha|md|^)(?=\d)|_
只需將上面的內容替換為一個空格即可。
Java代碼:
List<String> inputs = Arrays.asList("test123", "84test", "test_md5", "sha256",
"word_two_sha1", "w0rd");
for (String input : inputs) {
String output = input.replaceAll("(?<=\\d)(?=\\D)|(?<=\\D)(?<!sha|md|^)(?=\\d)|_", " ");
System.out.println(input + " > " + output);
}
這打印:
test123 > test 123
84test > 84 test
test_md5 > test md5
sha256 > sha256
word_two_sha1 > word two sha1
w0rd > w 0 rd
這里的基本正則表達式策略是在數字和非數字字符之間的邊界處拆分,除非前面是sha
或md
。
作為替代方案,您也可以使用
(?<!\d|^)(?<!(?<![^\W_])(?:sha|md))(?=\d)|(?<=\d)(?!\d|$)|_
它將在數字和非數字或下划線之間匹配 position。
如果右側有數字,則數字之前的內容不能是sha或md ,其前面沒有任何字符,除了沒有下划線的單詞 char。
解釋
(?<!\d|^)
如果不回看數字或字符串開頭(?<!
如果不回頭
(?<![^\W_])
如果不回顧除下划線以外的單詞 char(?:sha|md)
匹配sha或md后跟可選數字)
近距離觀察(?=\d)
直接在右邊斷言一個數字|
或者(?<=\d)(?!\d|$)
如果回看一個數字而不期待一個空白字符或字符串結尾|
或者_
匹配下划線例子
String strings[] = {"Aisha256", "ai_sha256", "test123", "84test", "test md5", "sha256", "word two sha1", "w0rd", "test_md5", "sha256", "md5"};
for (String str : strings){
System.out.println(str.replaceAll("(?<!\\d|^)(?<!(?<![^\\W_])(?:sha|md))(?=\\d)|(?<=\\d)(?!\\d|$)|_", " "));
}
Output
Aisha 256
ai sha256
test 123
84 test
test md5
sha256
word two sha1
w 0 rd
test md5
sha256
md5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.