5

注意:我正在使用 3rd 方应用程序,它使用正则表达式进行搜索,它有自己的风格,但几乎总是像 java 的正则表达式风格一样工作。当然,这可能无关紧要。

在搜索了同一个问题的许多不同方式(措辞很多)之后,我没有看到任何教程、示例,甚至没有提到是否可以同时使用“是”(肯定的?)和“不是”(负?)定义在同一范围内。

我现在无法在应用程序中运行示例以查看我的想法是否有效,因为正在搜索的数据量很大,并且会搞砸它已经收集的匹配项。我只是因为这个才问的。

以下是我认为可能有效但导致测试人员行为怪异的示例:

[\w^\s<>.!?]{2}
[\w|^\s<>.!?]{2}

我宁愿让它按照我认为第一个工作的方式工作(任何数字、小写或大写字符,或其他不是空格的普通字符,>、<、句点、!或?)而不是第二个只有 or 运算符。

我使用的正则表达式测试器给了我不同的时髦结果,这让我感到困惑。

另请注意:我在捕获组中使用它,然后是捕获所有匹配项,我可能会或可能不会正确使用它。因此,如果您想包括如何遵循我正在尝试的内容以及如何正确地做到这一点,请随意。我主要只是好奇这是否可能,或者这是一个不正确的方法。

4

3 回答 3

5

为什么你需要\w呢?

[^\s<>.!?]{2}

这已经匹配所有字母数字字符,因为它们既不是空格也不是您提到的任何标点符号。

通常,您可以 在某种程度上减去字符类,例如,要匹配不包括数字的字母数字,您可以这样做

[^\W\d]

因为[^\W]与 , 匹配相同\w,并\d从中减去,因为它在否定字符类中。

编辑:

一些正则表达式引擎(如 XPath、.NET 和 JGSoft)允许灵活的字符类减法,如下所示:

[a-z-[e-g]]

匹配范围内的任何字符,[a-z]不包括和。但是Java没有这个特性。efg

于 2012-10-08T15:31:23.643 回答
2

另一种可能性是使用两个范围并将它们组合起来;例如

([\w]|[^\s<>.!?]){2}

但是,这确实提出了您在此处实际要表达的内容的问题。因为这个例子(因为我已经重写了它)没有多大意义。

它所说的是“一个单词字符,或任何不是空格或某些标点符号的字符”。但是不是“空格或某些标点符号”的字符类别已经包括所有单词字符。因此,除非您的意思有所不同,否则 the\w是多余的。

于 2012-10-08T15:36:56.313 回答
0

从您的问题来看,看起来没有空格的正则表达式可以满足您的需求,您可以通过以下方式实现:

[\S]{2}
于 2012-10-08T15:33:33.650 回答