[英]Convert Javascript regular expression to Java syntax
我知道 regEx 在語言中很常見……但是我在編寫 Java 語法時遇到了麻煩。 我有一個用 JS 編碼的正則表達式;
if((/[a-zA-Z]/).test(str) && (/[0-9]|[\x21-\x2F|\x3A-\x40|\x5B-\x60|\x7B-\x7E]/).test(str))
return true;
我如何在 Java 中編寫相同的內容?
我已經進口
import java.util.regex.Matcher;
import java.util.regex.Pattern;
補充一點,從我的嘗試來看,\\x 是一個無效的轉義字符。
將前導和尾隨'/'
字符更改為'"'
,然后將每個'\\'
替換為"\\\\"
。
與 JavaScript、Perl 和其他腳本語言不同,Java 沒有用於正則表達式的特殊語法。 相反,它們(通常)使用 Java 字符串文字來表示。 但是'\\'
是 Java 字符串文字中的轉義字符,因此原始正則表達式中的每個'\\'
都必須使用第二個'\\'
進行轉義。 (如果正則表達式中有文字反斜杠字符,則在 Java 字符串文字中最終會出現"\\\\\\\\"
!!)
這對於 Java 新手來說有點令人困惑/令人生畏,但它完全合乎邏輯。 請記住,您正在使用 Java字符串文字來表達正則表達式。
但是,正如@antak 所指出的,Java 和 JavaScript 實現的正則表達式語言之間存在各種差異。 因此,如果您使用任意 JavaScript 正則表達式並將其音譯為 Java(如上所述),它可能無法正常工作。
以下是一些總結差異的參考資料。
您可以使用在線正則表達式評估器(如https://regex101.com)進行轉換。
ECMAScript (JavaScript) FLAVOR
TOOLS -> Code Generator (LANGUAGE - Java)
即使它不是硬核程序員的方式,它也明顯不太容易出錯。 特別是如果您只需要轉換一兩個表達式。
如果您真的需要 Java 中的 Javascript 正則表達式語義,一種方法是使用嵌入式 Javascript 引擎來評估正則表達式。 例如:
javax.script.ScriptEngineManager se = new javax.script.ScriptEngineManager();
javax.script.ScriptEngine engine = se.getEngineByName("js");
String regExp = "/^\\d+$/";
engine.put("str", "1234");
engine.eval("var rgx=" + regExp);
Object value = engine.eval(
"function validate(r, s){ return (r).test(s);};validate(rgx, str);");
logger.log(value);
您唯一需要做的就是復制反斜杠。
Pattern p1 = Pattern.compile("[a-zA-Z]");
Pattern p2 = Pattern.compile("[0-9]|[\\x21-\\x2F|\\x3A-\\x40|\\x5B-\\x60|\\x7B-\\x7E]");
if (p1.matcher(str).find() && p2.matcher(str).find()) {
return true;
}
如果您想在 Javascript 和 Java 中使用相同的正則表達式,請嘗試在運行時獲取正則表達式字符串,而不是嘗試在編譯時定義正則表達式。 在編譯時它會檢查語法並給出無效的轉義字符錯誤,但是在運行時它不會檢查語法並直接編譯模式。
如果您可以從 API 獲取正則表達式或可以從本地存儲的文本文件中讀取它,那就太好了。
Java 正則表達式首先是字符串,因此您必須以雙引號而不是/
開頭。 此外,在java中,您需要通過執行其中兩個像這樣的\\\\
來轉義\\
。
有關更多信息,請查看 Oracle 的本教程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.