regex 可用空间正则表达式选项(Pattern.COMMENTS)未按预期工作

8oomwypt  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(68)

我正在尝试使用正则表达式来检测亵渎。但是我想检测这个词,即使他们把这个词像“亵渎”这样的词隔开了。但是当使用“(?x)”选项时,它仍然不想检测。
我目前得到:

(?ix).*Bad Word.*

我试过使用http://www.rubular.com来调试表达式,但运气不好。
如果它在任何方面有帮助的话,它是在Teamspeak Bot,我想踢用户在他们的名字中有禁止的话。在配置中,它指的是http://docs.oracle.com/javase/1.5.0/docs/api/java/util/regex/Pattern.html,我找不到任何与(?)选项有关的东西。
bot本身可以在这里找到:https://forum.teamspeak.com/threads/51286-JTS3ServerMod-Multifunction-TS3-Server-Bot-(Idle-Record-Away-Mute-Welcome-)

xdnvmnnf

xdnvmnnf1#

当使用“(?x)”选项时,它仍然不想检测
(?x)是一个嵌入式标志选项(也称为内联修饰符/选项),它启用Pattern.COMMENTS选项,也称为自由空格模式,该模式启用正则表达式中的注解,并使正则表达式引擎忽略模式中的所有常规空格。
在自由空间模式下,正则表达式标记之间的空白将被忽略。空白包括空格、制表符和换行符。请注意,只有标记之间的空白将被忽略。a b c与自由空间模式下的abc相同。但\ d\d不同。前者与d匹配,而后者匹配一个数字。\d是由一个反斜杠和一个"d"组成的单个正则表达式标记。用空格分隔该标记将得到一个转义空格(它匹配一个空格)和一个文字“d”。
同样,分组修饰符不能拆分。(?>atomic)(?> ato mic )( ?>ato mic)相同。它们都匹配相同的atomic group。它们与(? >atomic)不同。后者是一个语法错误。?>分组修饰符在正则表达式语法中是一个单一元素,必须放在一起。这对所有这样的结构都是正确的。包括X1 E2 F1 X、X1 E3 F1 X等。
因此,要使用(?x)修饰符匹配模式中的单个空格,需要对其进行转义:

String reg = "(?ix).*Bad\\ Word.*";   // Escaped space matches a space in free spacing mode
String reg = "(?ix).* Bad\\ Word .*"; // More formatting spaces, same pattern

注意您 * 不能 * 将空格放入字符类中以使其在Java正则表达式中有意义。请参见以下内容:

然而,Java在自由空格模式下并不将字符类视为单个标记。Java会忽略字符类中的空格、换行符和注解。因此,在Java的自由空格模式下,[abc][ a b c ]是相同的。
此外,我认为您实际上是想确保您的模式能够匹配可能包含换行符的完整字符串。这意味着,您需要(?s)Pattern.DOTALL,modifier:

String reg = "(?is).*Bad Word.*";

此外,要匹配任何空格,可以使用\s

String reg = "(?ix).*Bad\\sWord.*"; // To only match 1 whitespace
String reg = "(?ix).*Bad\\s+Word.*"; // To account for 1 or more whitespaces

相关问题