gpt4 book ai didi

java - Java中的正则表达式黑暗角落...字符顺序改变了正则表达式的含义?

转载 作者:行者123 更新时间:2023-12-01 06:57:52 25 4
gpt4 key购买 nike

我最近遇到了一些涉及 Java 正则表达式引擎的奇怪行为。

在编写一些验证时,我需要在正则表达式中添加方括号,如下所示:

"[^a-zA-Z0-9_/.@ ]"  // original expression
"[^a-zA-Z0-9_/.@ /]/[]" // first modificiation

但是...这个实现失败了。经过实验,我发现如果将空格 char 移到末尾就可以了。

"[^a-zA-Z0-9_/.@/]/[ ]"  // final working modification

现在,使用此表达式的调用代码使用了 String.replaceAll(String, String) 方法,如所列 here .

我的问题是...对于为什么空格的放置会改变这个正则表达式的含义,有人有什么好的技术想法吗?其实应该没什么关系。

[已编辑]从评论和答案来看,这是一个使用内置 String 方法导致未捕获的不正确行为的示例。我的运行时环境根本不会提示,即使您阅读了 String.replaceAll(String, String) 上的文档,它清楚地表明它与 Pattern.compile(regex) 具有相同的功能.matcher(str).replaceAll(repl) 我想我会提交一个错误。

最佳答案

您使用了错误的转义字符,它是 \ 而不是 /

另外,我不确定您是否希望您的字符组包含 /. 或者您是否认为 . 需要在字符组中转义(不需要转义:它始终表示字符组中的文字 .)。

尝试编译[^a-zA-Z0-9_/.@/]/[]时出现以下异常:

java.util.regex.PatternSyntaxException: Unclosed character class near index 20[^a-zA-Z0-9_/.@ /]/[]                    ^    at java.util.regex.Pattern.error(Pattern.java:1713)    at java.util.regex.Pattern.clazz(Pattern.java:2254)    at java.util.regex.Pattern.sequence(Pattern.java:1818)    at java.util.regex.Pattern.expr(Pattern.java:1752)    at java.util.regex.Pattern.compile(Pattern.java:1460)    at java.util.regex.Pattern.(Pattern.java:1133)    at java.util.regex.Pattern.compile(Pattern.java:823)

This indicates that there is a problem with the character class at that point. And in fact: you've got an empty character class [] which is not valid!

[^a-zA-Z0-9_/.@ /]/[] means "a character not matching (a-z, A-Z, 0-9, _, /, ., @, or /), followed by a slash / followed by <fails to compile because it is malformed>".

What you want is probably [^a-zA-Z0-9_.@ \]\[] which is "a character not matching a-z, A-Z, 0-9, _, ., @, , ] or [".

If you write it in a String literal remember to double the \ (because they have special meanings in String literals as well!):

Pattern regex = Pattern.compile("[^a-zA-Z0-9_.@ \\]\\[]");

关于java - Java中的正则表达式黑暗角落...字符顺序改变了正则表达式的含义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7386940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com