这是我的正则代码:
{"mac":"kanok","pass":"kanok","passphrase":"root1234","ssid":"aplsh90","user":"kanok"}
实际上真正的问题是这样的。我想更改将匹配的每个\\s*(?i)href\\s*=\\s*(\"(([^\"]*\")|'[^']*'|([^'\">\\s]+)))
的值,除了这两种类型href
和<link href="foo.css">
。我想保留这两个<link href="boo.ico">
的价值。
String
Pattern p = Pattern.compile(HTML_A_HREF);
Matcher m = p.matcher(getLine());
setNewLine(m.replaceAll((String.format("%-1s", sp))+"href=\"javascript:history.go(0)\"" + (String.format("%-1s", sp))));
是html文件本身。
getLine()
答案 0 :(得分:0)
你的正则表达式已关闭。为了告诉你,让我爆炸吧:
\\s*(?i)href\\s*=\\s*
(\"
(
([^\"]*\")
|
'[^']*'
|
([^'\">\\s]+)
)
)
领先的双引号位于多选区块之外。它需要在第一选择部分。
此外:
(?i)
。\"
,一组括号消失。所以,这意味着:
(?i)\\s*href\\s*=\\s*
(?:
\"[^\"]*\"
|
'[^']*'
|
[^'\">\\s]+
)
哪个是(?i)\\s*href\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^'\">\\s]+)
。
关于替换代码:
String sp = "";
m.replaceAll((String.format("%-1s", sp))
+
"href=\"javascript:history.go(0)\""
+
(String.format("%-1s", sp))
)
(String.format("%-1s", sp))
时sp = ""
的目的是什么?一个空字符串,格式化为至少适合1个空格,左对齐。那是一个单独的空间,即" "
,为什么所有这些开销呢?
m.replaceAll(" href=\"javascript:history.go(0)\" ")
最后,您要排除foo.css
和boo.ico
。
这样做的一种方法是使用负面预测。由于你有3个选择,你需要重复3次:
(?i)\\s*href\\s*=\\s*
(?:
\"(?!foo\\.css|boo\\.ico)[^\"]*\"
|
'(?!foo\\.css|boo\\.ico)[^']*'
|
(?!foo\\.css|boo\\.ico)[^'\">\\s]+
)
我会让你把它折回到一行。
<强>更新强>
如果您要排除所有.css
和.ico
个文件,请使用否定的lookbehind。
另外,我忘了逃避.
,抱歉。修好了。
(?i)\\s*href\\s*=\\s*
(?:
\"[^\"]*(?<!\\.css|\\.ico)\"
|
'[^']*(?<!\\.css|\\.ico)'
|
[^'\">\\s]+(?<!\\.css|\\.ico)
)