Java匹配与JavaScript匹配的结果差异
当我做一个简单的测试时,我正在复习java中的正则表达式Java匹配与JavaScript匹配的结果差异,java,javascript,regex,Java,Javascript,Regex,当我做一个简单的测试时,我正在复习java中的正则表达式 Pattern.matches("q", "Iraq"); //false "Iraq".matches("q"); //false 但是在JavaScript中 /q/.test("Iraq"); //true "Iraq".match("q"); //["q"] (which
Pattern.matches("q", "Iraq"); //false
"Iraq".matches("q"); //false
但是在JavaScript中
/q/.test("Iraq"); //true
"Iraq".match("q"); //["q"] (which is truthy)
这是怎么回事?我可以让我的java正则表达式模式“q”的行为与JavaScript相同吗?这是因为在java
pattern中,matches
或String#matches
期望您匹配完整的输入字符串,而不仅仅是其中的一部分
另一方面,Javascript的
String#match
可以部分匹配输入,正如您在示例中看到的那样。在Javascript中,String.match
查找部分匹配。在Java中,Pattern.matches
如果整个输入字符串与给定的模式匹配,则返回true
。这相当于说,在你的例子中,“伊拉克”应该匹配^q$
,但显然不匹配
这里是它的来源(注意,Pattern.matches
在内部创建一个Matcher
,然后对其调用matches
):
public boolean matches()
尝试根据图案匹配整个区域。如果匹配成功,则可以通过start、end和group方法获得更多信息
返回:当且仅当整个区域序列匹配此匹配器的模式时为true
如果只想测试字符串的一部分,请在正则表达式的开头添加*?
,并在末尾添加*
,例如Pattern.match(“伊拉克”和“*?q*)”
)
请注意,
*q.*
也可以工作,但是如果输入字符串很长,在前面使用不情愿的运算符可能会显著提高性能。有关不情愿运算符和贪婪运算符之间的区别以及它们对回溯的影响的解释,请参见。在JavaScriptmatch
中,返回与使用的正则表达式匹配的子字符串。在Java中,检查整个字符串是否与正则表达式匹配
如果您想找到匹配正则表达式的子字符串,请使用Pattern和Matcher类,如
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(yourData);
while(m.find()){
m.group();//this will return current match in each iteration
//you can also use other groups here using their indexes
m.group(2);
//or names (?<groupName>...)
m.group("groupName");
}
Pattern p=Pattern.compile(regex);
Matcher m=p.Matcher(您的数据);
while(m.find()){
m、 group();//这将在每次迭代中返回当前匹配项
//您也可以在此处使用其他组的索引
m、 组(2);
//或名称(?……)
m、 集团(“集团名称”);
}
请不要仅仅根据两种语言的名称来比较它们的方法。我发现它与整个字符串相匹配,但java除了“有关正则表达式构造行为的更精确描述,请参阅《掌握正则表达式》,第3版,Jeffrey E.F.Friedl,O'Reilly and Associates,2006年”之外,没有任何文档。”在您引用的句子之前,至少有9个屏幕详细阐述了Java正则表达式的语法和语义。当然,这只是类文档,您调用的特定方法的文档指出了这一点:好的,我发现它不是在模式上,而是在(显然)上Matcher的页面-matches方法尝试根据模式匹配整个输入序列…如果我理解正确,这只是一个不同的引擎周期。它们在Java、Ruby、JavaScript、Python、.NET等方面的工作方式不同,是吗?是的,确实如此。Java的匹配此方法的名称也会引起很多混乱。Java中是否有一个开关可以防止它以开头和结尾字符作为前缀和后缀?顺便说一句:Python还有re.match()
和re.search()
。第一个匹配从头到尾搜索整个字符串,第二个搜索如果在Java中找到字符串,则按如下方式进行:Pattern.matches(“.*q.*”,“伊拉克”)
或更好地使用Pattern#find()
方法,该方法用于部分匹配。这就是我要寻找的。默认的匹配的行为。这正是我想要的for@jermel迈克尔·佩雷诺德:很高兴你喜欢它:):-)这句话是来自马彻的javadoc@jermel的确如此。固定的。