使用正则表达式

时间:2010-05-03 14:25:36

标签: java android regex

我在尝试使用JavaScript中使用的正则表达式时遇到问题。在网页上,您可能有:

<b>Renewal Date:</b> 03 May 2010</td>

我只是希望能够推出2010年5月3日,记住网页不仅仅包含上述内容。我目前使用JavaScript执行此操作的方式是:

DateStr = /<b>Renewal Date:<\/b>(.+?)<\/td>/.exec(returnedHTMLPage);

我尝试按照java.util.regex.Patternjava.util.regex.Matcher上的一些教程,但没有运气。我似乎无法将(。+?)翻译成他们能理解的内容?

感谢,

Noeneel

4 个答案:

答案 0 :(得分:4)

这是在java中使用正则表达式的方法:

Pattern p = Pattern.compile("<b>Renewal Date:</b>(.+?)</td>");
Matcher m = p.matcher(returnedHTMLPage);

if (m.find()) // find the next match (and "generate the groups")
    System.out.println(m.group(1)); // prints whatever the .+? expression matched.

Matcher类中还有其他有用的方法,例如m.matches()。看看http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Matcher.html

答案 1 :(得分:4)

matches vs find

问题是您应该使用matches时使用find。来自API

  
      
  • matches方法尝试将整个输入序列与模式匹配。
  •   
  • find方法扫描输入序列,寻找与模式匹配的下一个子序列。
  •   

请注意String.matches(String regex)也会查找整个字符串的完整匹配项。很遗憾String不提供部分正则表达式匹配,但您可以始终s.matches(".*pattern.*")代替。


关于不情愿的量词

Java完全理解(.+?)

以下是演示:您将获得一个字符串s,其中包含至少重复两次的字符串t。查找t

System.out.println("hahahaha".replaceAll("^(.+)\\1+$", "($1)"));
// prints "(haha)" -- greedy takes longest possible

System.out.println("hahahaha".replaceAll("^(.+?)\\1+$", "($1)"));
// prints "(ha)" -- reluctant takes shortest possible

关于转义元字符

还应该说你已经将\注入你的正则表达式("\\"作为Java字符串文字)。

        String regexDate = "<b>Expiry Date:<\\/b>(.+?)<\\/td>";
                                            ^^         ^^
        Pattern p2 = Pattern.compile("<b>Expiry Date:<\\/b>");
                                                      ^^

\用于转义正则表达式元字符。 /不是正则表达式元字符。

另见

答案 2 :(得分:1)

好的,所以使用aioobe的原始建议(我之前也尝试过),我有:

String regexDate = "<b>Expiry Date:</b>(.+?)</td>";
Pattern p = Pattern.compile(regexDate);
Matcher m = p.matcher(returnedHTML);

if (m.matches()) // check if it matches (and "generate the groups")
{
  System.out.println("*******REGEX RESULT*******"); 
  System.out.println(m.group(1)); // prints whatever the .+? expression matched.
  System.out.println("*******REGEX RESULT*******"); 
}

IF语句必须保持FALSE,因为******* REGEX RESULT *******永远不会输出。

如果有人错过了我想要实现的目标,我只是想把日期告诉我。在html页面中有一个类似<b>Expiry Date:</b> 03 May 2010</td>的日期,我想要2010年5月3日。

答案 3 :(得分:0)

(.+?)是一个奇怪的选择。请尝试( *[0-9]+ *[A-Za-z]+ *[0-9]+ *)或仅([^<]+)