Java Matcher matches()方法匹配异常:正则匹配含空格字符串结果不符
问题根源与解决方案
问题出在哪?
你用的.*?是惰性匹配,但它会匹配除换行外的任意字符(包括空格)。因为matches()要求完全匹配整个字符串,惰性匹配会被迫扩展到最后一个},把中间的空格也包含进单个{!...}分组里——相当于把{!expression1} {!expression2}当成了一个{!expression1} {!expression2}的表达式,所以返回true。
怎么解决?
把.*?换成[^}]+,这个表达式只会匹配除}之外的任意字符,能精准限定每个{!someExpression}的边界,不会把中间的空格或其他无关字符包含进去。
修改后的正则代码:
Pattern.compile("(\\{!([^}]+)\\})+").matcher("{!expression1} {!expression2}").matches()
测试验证
- 输入
{!expression1}{!expression2}:返回true(符合多个连续表达式的需求) - 输入
{!expression1} {!expression2}:返回false(符合你的预期) - 输入
{!singleExpression}:返回true(单个表达式也支持)
如果后续需要允许表达式之间有特定分隔符(比如逗号),可以在分组间添加对应规则,比如(\\{!([^}]+)\\})(?:,(\\{!([^}]+)\\}))*,按需调整即可。
内容的提问来源于stack exchange,提问作者Rahul Agarwal
相关产品推荐
相关产品推荐

