全部
如果我想从 .txt 文件中读取一个字符并将搜索边界(仅一个字符。空格)设置为读取“数字 2 到 9 或除 e 之外的小写字符”,以下两个正则表达式之一是正确的方法?
I. "[/w[2-9][a-z&&[^e]]]"
相对
II. "[[2-9][a-z&&[^e]]]"
我倾向于第二个,但我在 java.util.regex.Pattern 描述中找不到任何内容,该描述显示了如何同时搜索同一位置的数字和字符。任何帮助都会很棒。谢谢!^^
你会写:
[2-9a-df-z]
如果你真的想a-z
用明确的“not e
”来写,你可以写:
(?!e)[2-9a-z]
但我认为这对于这个目的来说太过分了。
试试[2-9a-df-z]
。这将匹配一个数字 from 2
to9
和除 之外的所有小写字符e
,即 from a
tod
和 from f
to z
。
您的第二个正则表达式是正确的,但您不需要所有这些括号。这将做:
"[2-9a-z&&[^e]]"
这将比@ruakh 的建议高效得多(?!e)[2-9a-z]
,后者必须在每个位置执行两次测试。这正是 Java 开发人员试图用交集运算符解决的问题&&
。Unicode 联盟已经认可了这个想法,以及其他集合操作。
我不知道您使用第一个正则表达式尝试什么,但是/
andw
都将被视为文字字符,使其等效于[2-9a-df-z/]
,这听起来不像您想要的。
编辑:不要误会我的意思,效率并不是喜欢这种方法的唯一原因。它甚至不是最重要的。过早的优化在正则表达式中和其他任何地方一样邪恶。专注于使您的正则表达式尽可能简单和清晰,您不必担心性能。我的正则表达式比前瞻版本更简单(因为它只执行一种操作)和更清晰(更易读)(但不是很多;这种&&
语法对我来说仍然看起来很可怕)。