Java 使用正则表达式

Java 使用正则表达式,java,android,regex,Java,Android,Regex,我在尝试使用JavaScript中使用的正则表达式时遇到问题。在网页上,您可能有: <b>Renewal Date:</b> 03 May 2010</td> 续约日期:2010年5月3日 我只想能够拉出2010年5月3日的页面,记住一个网页不仅仅包含上述内容。我目前使用JavaScript执行此操作的方式是: DateStr = /<b>Renewal Date:<\/b>(.+?)<\/td>/.exec(retur

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

<b>Renewal Date:</b> 03 May 2010</td>
续约日期:2010年5月3日
我只想能够拉出2010年5月3日的页面,记住一个网页不仅仅包含上述内容。我目前使用JavaScript执行此操作的方式是:

DateStr = /<b>Renewal Date:<\/b>(.+?)<\/td>/.exec(returnedHTMLPage);
DateStr=/续订日期:(.+?)/.exec(returnedHTMLPage);
我试图学习一些关于
java.util.regex.Pattern
java.util.regex.Matcher
的教程,但运气不好。我似乎无法将(.+?)翻译成他们能理解的东西

谢谢


Noeneel

这是正则表达式在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.
Pattern p=Pattern.compile(“续订日期:(.+?)”);
Matcher m=p.Matcher(返回的htmlpage);
if(m.find())//查找下一个匹配项(并“生成组”)
System.out.println(m.group(1));//打印任何内容?表情一致。
Matcher类中还有其他有用的方法,例如
m.matches()
。查看。

匹配项上
vs
查找
问题是您在本应使用
find
时使用了
matches
。从:

  • matches
    方法尝试根据模式匹配整个输入序列
  • find
    方法扫描输入序列以查找下一个与模式匹配的子序列
请注意,还将查找整个字符串的完全匹配。不幸的是,
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>");
                                                      ^^
String regexDate=“到期日:(.+?)”;
^^         ^^
模式p2=模式.compile(“到期日:”);
^^
\
用于转义正则表达式元字符。
/
不是正则表达式元字符

另见

    • (.+?)
      是一个奇怪的选择。试试
      (*[0-9]+*[A-Za-z]+*[0-9]+*)
      或者干脆
      ([^好的,所以使用aioobe的原始建议(我之前也尝试过),我有:

      String regexDate=“到期日:(.+?)”;
      Pattern p=Pattern.compile(regexDate);
      Matcher m=p.Matcher(returnedHTML);
      if(m.matches())//检查它是否匹配(并“生成组”)
      {
      System.out.println(“*******正则表达式结果*******”);
      System.out.println(m.group(1));//打印与.+?表达式匹配的任何内容。
      System.out.println(“*******正则表达式结果*******”);
      }
      
      IF语句必须一直显示为FALSE,因为永远不会输出*********正则表达式结果******


      如果有人错过了我想要实现的目标,我只是想把日期弄出来。在html页面中有一个日期,比如
      到期日:2010年5月3日
      ,我想要2010年5月3日。

      我只是按照之前的建议使用它。如果我只有:String regexDate=“到期日:(.+?)”;Pattern p=Pattern.compile(regexDate);Matcher m=p.Matcher(returnedHTML);if(m.matches())//检查它是否匹配(并“生成组”){System.out.println(*******************正则表达式结果*******);System.out.println(m.group(1));//打印与.System.out.println(“**********正则表达式结果*******”)匹配的任何表达式;}仍然fails@bebeTech:使用
      if(m.find())
      而不是
      if(m.matches())
      在这种情况下。请查看文档以了解区别。@polygene润滑剂:问题不在于他引入的反斜杠。它们最后只是引用了/后面的反斜杠,所以不应该弄乱结果(尽管它们当然是多余的)。@wds:Ah,你是对的。
      “/”。匹配(\\/)
      true
      。答案已重新构造。它可以作为ok语法使用并验证。只是无法将其用于JAVA。我可以将其用于JS。要获得部分匹配,您需要使用
      find()
      而不是
      matches()
      。我已编辑了aiobe的答案以解决此问题。@aiobe,再次感谢您。find()做了这个把戏。对于新手的问题,我很抱歉,我已经做了很多自学的JavaScript,现在我正在尝试转换到JAVA。然后将
      if(m.maches())
      更改为
      if(m.find())
      。正如上面提到的@polygenelubloodies!@Jan甚至很友好地更新了我的帖子,使用
      find()
      ,而不是
      matches()
      。是的,两个人回答正确,但我只能勾选一个?
      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*******"); 
      }