我有以下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有什么问题?
答案 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()
。