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

Java 可用空间正则表达式选项未按预期工作,java,regex,Java,Regex,我试图用正则表达式来检测亵渎。但我想检测这个词,即使他们像“亵渎”一样把这个词隔开。但是,当使用“(?x)”选项时,它仍然不想检测 我目前得到: (?ix).*Bad Word.* 我试着用它来调试这个表达式,但运气不好 如果它有任何帮助的话,那就是在Teamspeak机器人上,我想因为用户的名字中有被禁止的单词而踢他。在配置中,它指的是我找不到与(?)选项相关的任何内容的地方 可以在以下位置找到bot本身: 当使用“(?x)”选项时,它仍然不想检测 (?x)是一个嵌入式标志选项(也称为内联修

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

我目前得到:

(?ix).*Bad Word.*
我试着用它来调试这个表达式,但运气不好

如果它有任何帮助的话,那就是在Teamspeak机器人上,我想因为用户的名字中有被禁止的单词而踢他。在配置中,它指的是我找不到与(?)选项相关的任何内容的地方

可以在以下位置找到bot本身:

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

(?x)
是一个嵌入式标志选项(也称为内联修饰符/选项),用于启用
模式。COMMENTS
选项,也称为自由间距模式,用于启用正则表达式内的注释,并使正则表达式引擎忽略模式内的所有常规空白。根据:

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

同样,分组修饰符也不能拆分<代码>(?>原子)与
(?>ato话筒)
(?>ato话筒)
相同。它们都是一样的。它们与
(?>原子)
不同。后者是一个语法错误。
?>
分组修饰符是正则表达式语法中的单个元素,必须保持在一起。这适用于所有此类构造,包括

因此,要使用
(?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]
[abc]
相同

此外,我认为您实际上希望确保您的模式能够匹配可能包含换行符的完整字符串。也就是说,您需要
(?s)
模式.DOTALL
,修饰符:

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

我可以在这里看到问题。我们怎么知道“fish迭代器”不是真正合法的文本?@Tim Biegeleisen在配置中指定了多个正则表达式过滤器。机器人会运行它们,如果有匹配,它会踢用户。这里是配置:我想检测的原因是,无论空格是多少,人们总是通过将被禁止的单词分割成碎片来使用它们,x代表扩展模式并更改模式的解释方式:模式中a#后的空格和文本被忽略。这个如何:x代表扩展模式。它忽略正则表达式中的所有空格。正则表达式可以制作成一个。在你的例子中,
(?ix)。*Bad Word.
实际上被解释为
(?i)。*Bad Word.
,因此,你要么逃离空间
(?ix)。*Bad\Word.
,要么把它放到类中
(?ix)。*Bad[]Word.
你又引用了这个家伙吗。这:
同样,分组修饰符也不能分解。(?>原子)与(?>ato-mic)和(?>ato-mic)相同。它们都匹配同一个原子组
他应该说所有分组构造语法都不能在扩展模式下分解并用它来完成。因此,在扩展模式下,
(?>ato mic)
是一个错误,正如
(?>ato mic)
(?>ato mic)
(?:ato ster)
(?(1)ato mic)
一样。也许你应该忽略这些错误信息,以免混淆其他不知道的人。@sln你的评论与Java无关。查看
中的
“(?>\\d+\\p{L}+(!)”
123aa567bb-
中的
相匹配,因此在Java中,
(?>原子)
(?>ato麦克风)
(?>ato麦克风)
相同。对于大多数其他正则表达式风格,甚至可能是所有的正则表达式风格(我还没有测试过),您所说的是正确的(请参阅where
(?>\d+\p{L}+
不再是自由间隔模式下的原子组)。