java正则表达式告诉哪些列不匹配

8wtpewkr  于 2023-01-19  发布在  Java
关注(0)|答案(1)|浏览(126)

你好,
我的java代码如下:

Pattern p = Pattern.compile("^[a-zA-Z0-9$&+,:;=\\[\\]{}?@#|\\\\'<>._^*()%!/~\"`  -]*$");
String i = "f698fec0-dd89-11e8-b06b-☺";
Matcher tagmatch = p.matcher(i);
System.out.println("tagmatch is " + tagmatch.find());

正如预期的那样,答案将是false,因为里面有☺字符。但是,我想显示不匹配的列号。对于本例,它应该显示第25列有无效字符。
我可以知道我怎么做吗?

t9aqgxwy

t9aqgxwy1#

您应该从正则表达式中删除锚点,然后使用Matcher#end()方法获取它停止前一个匹配的位置,如下所示:

String i = "f698fec0-dd89-11e8-b06b-☺";
Pattern p = Pattern.compile("[\\w$&+,:;=\\[\\]{}?@#|\\\\'<>.^*()%!/~\"`  -]+");
Matcher m = p.matcher(i);
if (m.lookingAt() && i.length() > m.end()) { 
   System.out.println("Match <" + m.group() + "> failed at: " + m.end());
}
    • 输出:**
Match <f698fec0-dd89-11e8-b06b-> failed at: 24
    • PS**:我使用了lookingAt()来确保我们从区域的开头开始匹配模式。您也可以使用find()在任何地方获得下一个匹配,或者将模式中的起始锚点保留为
"^[\\w$&+,:;=\\[\\]{}?@#|\\\\'<>.^*()%!/~\"`  -]+"

并使用find()有效地使其行为类似于上面使用lookingAt()的代码。
Read difference between lookingAt() and find()
我已经重构了正则表达式,使用\w代替[a-zA-Z0-9_],并使用量词+(表示匹配1或更多)代替*(表示匹配0或更多),以避免对零长度匹配返回成功。

相关问题