可用空间正则表达式选项无法按预期工作

时间:2018-07-20 23:43:23

标签: java regex

我正在尝试使用正则表达式检测亵渎行为。但是,即使他们将“ Profa nity”之类的单词隔开,我也想检测该单词。但是,当使用“(?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,在这里我找不到与(?)选项有关的任何内容。

该机器人本身可以在这里找到:https://forum.teamspeak.com/threads/51286-JTS3ServerMod-Multifunction-TS3-Server-Bot-(Idle-Record-Away-Mute-Welcome-)

1 个答案:

答案 0 :(得分:1)

  

使用“(?x)”选项时,它仍然不想检测

(?x)是一个嵌入式标志选项(也称为内联修饰符/选项),它启用Pattern.COMMENTS选项,也称为自由间隔模式,该模式可在正则表达式中启用注释并生成正则表达式引擎会忽略该模式内的所有常规空格。根据{{​​3}}:

  

在自由空间模式下,正则表达式标记之间的空格将被忽略。空格包括空格,制表符和换行符。请注意,仅标记之间的空格被忽略。 {@ {1}}与a b c在自由行距模式下相同。但是abc\ d是不同的。前者与\d匹配,而后者与数字匹配。 d是由反斜杠和\d组成的单个正则表达式令牌。用一个空格分隔令牌会给您一个转义的空格(与一个空格匹配)和一个文字“ d”。

     

同样,分组修饰符也无法分解。 "d"(?>atomic)(?> ato mic )相同。它们都匹配相同的Free-Spacing in Character Classes。它们与( ?>ato mic)不同。后者是语法错误。 (? >atomic)分组修饰符是regex语法中的单个元素,必须保持在一起。对于所有此类构造,包括atomic grouplookaround等,都是如此。

因此,要使用?>修饰符匹配模式中的单个空格,您需要对其进行转义:

(?x)

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

  

但是,Java在自由间距模式下不会将字符类视为单个令牌。 Java确实会忽略字符类中的空格,换行符和注释。因此,在Java的自由行距模式下,String reg = "(?ix).*Bad\\ Word.*"; // Escaped space matches a space in free spacing mode String reg = "(?ix).* Bad\\ Word .*"; // More formatting spaces, same pattern [abc]相同。

此外,我认为您实际上是想确保您的模式可以匹配可能包含换行符的完整字符串。也就是说,您需要[ a b c ](?s),修饰符:

Pattern.DOTALL

此外,要匹配任何空格,您可以依靠String reg = "(?is).*Bad Word.*";

\s