Java Pattern与RegEx不匹配

时间:2016-08-29 11:23:19

标签: java regex

我有以下Java代码,它应该从String对象中提取url

public static void main() {
    String text = "Link to https://some.domain.com/subfolder?sometext is     available";
    String regex = "https://some\\.domain\\.com/subfolder[^ ]*";
    Pattern urlPattern = Pattern.compile(regex);

    Matcher m = urlPattern.matcher(text);

    String url = m.group();

    System.out.println(url);

    return;
}

但是,没有匹配,代码会因IllegalStateException而失败。

RegEx有什么问题?

3 个答案:

答案 0 :(得分:7)

您不能要求Matcher提供.group(),除非您调用了一个方法,要求Matcher对输入进行操作:{{1}之一}(首选),.find().lookingAt()

这就是为什么你得到.matches()

至于三者之间的差异,而javadoc告诉了所有这些,只是一个快速提醒:

  • IllegalStateException确实"真实"正则表达式匹配:它将在输入文本中的任何位置尝试匹配正则表达式;
  • .find()添加了模式在输入文本开头应匹配的约束;
  • .lookingAt()是一个用词不当,因为除.matches()强加的约束外,它还要求完整的输入文本("整个区域&#34 ;在javadoc中)匹配。

还请回想一下,这三个方法会返回一个布尔值,具体取决于匹配是否成功;如果结果为.lookingAt(),则您无法false

答案 1 :(得分:3)

您忘了拨打 NSArray *allObjectsArray; // your array NSMutableArray *resultObjectsArray = [NSMutableArray array]; for(NSDictionary *dict in allObjectsArray) { NSString *docName = [dict objectForKey:@"DocumentName"]; NSRange range = [docName rangeOfString:@"your string which you want to match" options:NSCaseInsensitiveSearch]; if(range.location != NSNotFound) [resultObjectsArray addObject:dict]; } m.find()。这是强制性的,否则m.matches()不起作用。

如果模式匹配,group()应返回find()。只有在这种情况下,true才会返回您的期望。

所以,修改你的代码如下:

group()

EDIT 关于要拨打的方法:.... if (!m.find()) { return; } String url = m.group(); ... find()matches()在字符串的一部分中查找模式,find()匹配完整字符串。它们与matches()contains()字符串相关。

我个人更喜欢使用equals(),因为在这种情况下,正则表达式完全定义了行为。如果我想匹配完整字符串,请使用find()^

答案 2 :(得分:2)

m.group()

以来
  

返回上一个匹配项匹配的输入子序列。

在使用m.matches()之前,您必须致电m.find()m.group()