1

全部

如果我想从 .txt 文件中读取一个字符并将搜索边界(仅一个字符。空格)设置为读取“数字 2 到 9 或除 e 之外的小写字符”,以下两个正则表达式之一是正确的方法?

I. "[/w[2-9][a-z&&[^e]]]"  

相对

II. "[[2-9][a-z&&[^e]]]"

我倾向于第二个,但我在 java.util.regex.Pattern 描述中找不到任何内容,该描述显示了如何同时搜索同一位置的数字和字符。任何帮助都会很棒。谢谢!^^

4

3 回答 3

1

你会写:

[2-9a-df-z]

如果你真的想a-z用明确的“not e”来写,你可以写:

(?!e)[2-9a-z]

但我认为这对于这个目的来说太过分了。

于 2012-09-23T23:16:55.940 回答
1

试试[2-9a-df-z]。这将匹配一个数字 from 2to9和除 之外的所有小写字符e,即 from atod和 from fto z

于 2012-09-23T23:16:56.167 回答
1

您的第二个正则表达式是正确的,但您不需要所有这些括号。这将做:

"[2-9a-z&&[^e]]"

这将比@ruakh 的建议高效得多(?!e)[2-9a-z],后者必须在每个位置执行两次测试。这正是 Java 开发人员试图用交集运算符解决的问题&&。Unicode 联盟已经认可了这个想法,以及其他集合操作

我不知道您使用第一个正则表达式尝试什么,但是/andw都将被视为文字字符,使其等效于[2-9a-df-z/],这听起来不像您想要的。


编辑:不要误会我的意思,效率并不是喜欢这种方法的唯一原因。它甚至不是最重要的。过早的优化在正则表达式中和其他任何地方一样邪恶。专注于使您的正则表达式尽可能简单和清晰,您不必担心性能。我的正则表达式比前瞻版本更简单(因为它只执行一种操作)和更清晰(更易读)(但不是很多;这种&&语法对我来说仍然看起来很可怕)。

于 2012-09-24T03:29:52.323 回答