我在尝试使用JavaScript中使用的正则表达式时遇到问题。在网页上,您可能有:
<b>Renewal Date:</b> 03 May 2010</td>
我只是希望能够推出2010年5月3日,记住网页不仅仅包含上述内容。我目前使用JavaScript执行此操作的方式是:
DateStr = /<b>Renewal Date:<\/b>(.+?)<\/td>/.exec(returnedHTMLPage);
我尝试按照java.util.regex.Pattern
和java.util.regex.Matcher
上的一些教程,但没有运气。我似乎无法将(。+?)翻译成他们能理解的内容?
感谢,
Noeneel
答案 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]+ *)
或仅([^<]+)
。