簡體   English   中英

將 Javascript 正則表達式轉換為 Java 語法

[英]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)進行轉換。

  1. 轉到https://regex101.com
  2. 選擇ECMAScript (JavaScript) FLAVOR
  3. 插入您的正則表達式
  4. 打開TOOLS -> Code Generator (LANGUAGE - Java)
  5. 復制粘貼

即使它不是硬核程序員的方式,它也明顯不太容易出錯。 特別是如果您只需要轉換一兩個表達式。

如果您真的需要 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM