java中的正则表达式帮助

时间:2011-12-21 04:06:12

标签: java regex arrays

我试图沿着

的行提取这些标签内的信息
  • 你好= barry0238293<
  • 你好= terry2938298<
  • 你好= bruce8392382<

我写的表达是

hello=(.*)<

我认为这会有效,但事实并非如此。

如果我完全错误的话,你能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:1)

&LT(*);并不是一个很好的正则表达式。星限定位器是贪婪的并且它将消耗所有输入,但是正则表达式引擎会注意到它之后有一些东西,并且它将开始回溯直到它找到以下文本(在这种情况下小于符号)。这可能会导致严重的性能下降。例如,我在某些代码中有其中一个(我很懒 - 程序员很糟糕!),并且在一个非常小的输入字符串上执行了1100 +毫秒的操作。

更好的表达式将是这样的"hello=([^<]*)<"大括号[]形成一个字符类,但是当克拉^作为字符类中的第一个条目时,它会否定该类。即它说找到不在下面的集合中的字符,然后你添加终止字符<,正则表达式引擎将搜索,直到找到小于号而不必回溯。

我破解了一个在clojure中使用原始Java正则表达式类的快速示例,以确保我的正则表达式有效。我忽略了clojure中内置的正则表达式支持,以表明它可以与常规Java API一起使用,以确保它的方面清晰。 (这不是如何在clojure中执行正则表达式的一个很好的例子。)我添加了注释(它们遵循示例中的;;)转换为Java,但是如果你知道正则表达式API,那么应该很清楚

;; create a pattern object
user=> (def p (java.util.regex.Pattern/compile "hello=([^<]*)<"))
#'user/p

;; create a matcher for the string
user=> (def m (.matcher p "hello=bruce8392382<"))
#'user/m

;; call m.matches()
user=> (.matches m)
true

;; call m.group(1) 
user=> (.group m 1)
"bruce8392382"

答案 1 :(得分:0)

我认为这应该很接近:/hello\=(\w*)\</

'='和'&lt;'是元字符,因此在它们之前添加'\'可确保它们被正确识别。 '\ w'匹配[a-zA-Z0-9],但是如果你需要在名称和数字之间分开,你可以用([a-zA-Z]+\d+)之类的东西替换它。

(.*)不起作用,因为它很贪婪,这意味着它会匹配'&lt;'最后也是。您可能需要进一步调整,但它应该可以帮助您入门。

答案 2 :(得分:0)

这有效:

Pattern p = Pattern.compile("hello=(.*)<");
Matcher m = p.matcher("hello=bruce8392382<");
if (m.matches) {
    System.out.println(m.group(1));
}