![](/img/trans.png)
[英]How to skip a specific word when replace the String using regexp in java
[英]Regexp to match Javascript string literals with a specific keyword using Java
我正在嘗試匹配JS代碼塊並使用Java提取包含給定關鍵字的字符串文字。
在嘗試使用我自己的正則表達式完成此操作后,我最終修改了這個通用的字符串 - 文字匹配regexp(在Java中構建模式時使用的Pattern.COMMENTS):
(["']) (?:\\?+.)*? \1
以下
(["']) (?:\\?+.)*? keyword (?:\\?+.)*? \1
測試用例:
var v1 = "test";
var v2 = "testkeyword";
var v3 = "test"; var v4 = "testkeyword";
正則表達式正確地與第1行匹配並且正確匹配第2行。
但是,在第3行中,它不是僅匹配“testkeyword”,而是匹配塊
"test"; var v4 = "testkeyword"
這是錯誤的 - 正則表達式與第一個雙引號匹配並且沒有在第二個雙引號處終止,一直持續到行尾。
有沒有人有任何想法如何解決這個問題?
PS:請記住,Regexp必須正確處理字符串文字中的轉義單引號和雙引號字符(廣義匹配器已經這樣做了)。
這個修改怎么樣:
(?:
"
(?:\\"|[^"\r\n])*
keyword
(?:\\"|[^"\r\n])*
"
|
'
(?:\\'|[^'\r\n])*
keyword
(?:\\'|[^'\r\n])*
'
)
經過多次修改(參見編輯歷史,主頁觀眾:),我相信這是我的最終答案:
(?:
"
(?:\\?+"|[^"])*
keyword
(?:\\?+"|[^"])*
"
|
'
(?:\\?+'|[^'])*
keyword
(?:\\?+'|[^'])*
'
)
您需要為單引號或雙引號字符串編寫兩種模式,因為無法使正則表達式記住打開字符串。 然后你可以和他們一起|。
考慮使用來自Rhino的代碼--Java中的JS - 來獲得真正的String文字。
或者,如果要使用正則表達式,請考慮對整個文字進行一次查找,然后在文字包含“關鍵字”時進行嵌套測試。
我認為Tim的建設有效,但我不會在所有情況下都打賭它,如果必須處理那些不想被發現的文字,那么正則表達式必須變得非常笨拙(好像試圖潛入你的測試)。 例如:
var v5 = "test\x6b\u0065yword"
與任何解決方案分開,我交互式制作正則表達式的秘密武器是我制作的名為Regex Powertoy的工具,與許多此類實用程序不同,它在任何支持Java applet的瀏覽器中運行。
構造字符串文字的語法大致如下:
string-literal ::= quote text quote text ::= character text | character character ::= non-quote | backslash quote
非引用,反斜杠和引用是終端。
如果語法是無上下文的(即所有規則的左側始終是單個非終端),並且所有規則的右側始終為空,終端或終端后跟非語法,則語法是常規的終奌站。
您可能會注意到上面給出的第一條規則有一個終端,后跟一個非終結符,后跟一個終端。 因此,這不是常規語法。
正則表達式是一種表達式,可以解析常規語言(可以通過常規語法構造的語言)。 無法使用正則表達式解析非常規語言。
在尋找合適的正則表達式時遇到的困難源於不存在合適的正則表達式的事實。 通過這種方式,您永遠不會得到明顯正確的代碼。
按照上述規則編寫簡單的解析器要容易得多。 由於字符串文字包含的文本是常規文本,因此在從周圍環境中提取文本后 ,可以使用簡單的正則表達式查找關鍵字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.