REGEX:获得href =""的价值除了细绳外

时间:2016-06-02 05:16:54

标签: java html regex

这是我的正则代码:

{"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()

1 个答案:

答案 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.cssboo.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)
)