Java正则表达式中的常见问题
这篇文章总结了问关于Java正则表达式的热门问题。因为它们是最常见的,你会发现,他们也非常有用。
1,如何从一个字符串中提取数字?
使用正则表达式的一个常见问题是提取所有的数字到整数的数组。
在Java中,\ D
是指一系列的数字(0-9)。使用预定义的类只要有可能会使你的代码更易于阅读和消除畸形字符类引入的错误。详情请参阅预定义字符类的更多细节。请注意,第一个反斜杠\
中\ D
。如果你是一个字符串中使用转义构造,你必须先反斜杠用另一个反斜杠的编译字符串。这就是为什么我们需要使用\ \ D
。
2,如何分割Java字符串按换行?
至少有三种不同的方式进入一个新行字符,这取决于您正在使用的操作系统。
- \ r表示CR(回车),它是在Unix系统
- \ n表示LF(换行),在Mac OS中使用
- \ r \ n表示CR + LF,在Windows中使用
因此,最简单的方法由新线分割字符串
String lines[] = String.split(“\\r?\\n”);
但是,如果你不想空行,你可以使用,这也是我最喜欢的方式:
String.split(“[\\r\\n]+”)
一个更强大的方式,这是真正的系统无关,如下所示。但要记住,你仍然会得到空行如果有两个换行符并排放置。
String.split(System.getProperty(“line.separator”));
3,重要性Pattern.compile的()
正则表达式,指定为字符串,必须首先被编译成的一个实例模式类。格局。编译()方法是创建对象的一个实例的唯一途径。一个典型的调用顺序是这样
从本质上讲,模式。编译()是用来将一个正则表达式到有限状态机(见编译原理,技术与工具(第二版))。但是,所有参与表演比赛的状态驻留在匹配器。通过这种方式,图案 p可以重复使用。和许多匹配器可以共享相同的模式。
模式。匹配()方法被定义为一种方便的时候一个正则表达式只使用一次的。这种方法仍然使用编译()来获得一个实例模式含蓄,和一个字符串相匹配。因此,
boolean b = Pattern.matches(“a*b”, “aaaaab”);
等同于上述第一个代码,虽然对重复匹配它是低效率的,因为它不允许编译图案被重复使用。
4,如何逃脱的文本正则表达式?
一般情况下,正则表达式使用“\”来转义构造,但它是痛苦的反斜杠前加上另一个反斜杠的Java字符串来编译。还有另一种方式为用户传递字符串文字到图案,像“$ 10”。而不是写\ \5美元或[$] 5,我们可以键入
Pattern.quote(“$5″);
5,为什么的String.Split()需要的钢管分隔符进行转义?
字符串。分裂()分割围绕给定的正则表达式匹配的字符串。Java表达式支持,影响一个模式匹配的方式,这就是所谓的特殊字符元字符。|
是用来匹配一个正则表达式了几种可能的正则表达式元字符1。例如,A | B
意味着要么一个
或乙
。详情请参阅交替与竖线或管道符号更多的细节。因此,要使用|
作为文学,你需要通过添加逃脱它\
在它的前面,像\ \ |
。
6,我们如何匹配ñ b Ñ与Java正则表达式?
这是所有非空的字符串组成的一定数目的语言一
的后面同等数量的b
的,像AB
,AABB
,和AAABBB
。这种语言可以被显示为上下文无关文法S→ASB | AB,因此非正则语言。
然而,Java正则表达式实现可以识别的不仅仅是正规语言。也就是说,他们不是“正规军”通过形式语言理论的定义。采用超前和自我参照的匹配将实现它。在这里,我将给出最终的正则表达式,然后再解释它一点点。对于一个全面的解释,我想请您阅读我们如何匹配^ nb的n次方与Java正则表达式。
而不是解释这个复杂的正则表达式的语法,我宁愿说一点点它是如何工作的。
- 在第一次迭代,它停在第一个一个再向前看(跳过一些后一个通过使用S 一*)是否有b。这是通过使用实现(:一(= A *(\ \ 1 + B))?) 。如果匹配,\ 1,自参考匹配,将匹配的非常内parenthesed元素,这是一个单一的b中的第一次迭代。
- 在第二次迭代中,表达式将停在第二一个,那么它看起来未来(再跳过一个次),看看是否会出现b。但是这一次,\ \ 1 + B实际上相当于BB了,所以两种b s有被匹配。如果是这样,\ 1将变为bb上的第二次迭代后。
- 在Ñ次迭代,表达停在Ñ第一个,看看是否有Ñ b s前进。
通过这种方式,该表达式可以算的数一 s和匹配,当数b接着由s 一个是相同的。
7,如何更换2个或多个空格,在单串空间和只删除前导空格?
字符串。的replaceAll()替换每个子给定的正则表达式与给定替换匹配。“2个或多个空格”可以通过正则表达式来表示[] +。因此,下面的代码会正常工作。需要注意的是,该解决方案最终不会删除所有前导和尾部空格。如果你想将它们删除,您可以使用字符串。修剪()的管道。
8,如何确定某个数字与正则表达式是一个一致的?
该函数首先生成Ñ字符数,并试图看看是否字符串匹配|
。?(?
+
)
\ \ 1 +
。如果是素数,则表达式将返回错误和!
将扭转的结果。
第一部分。?
只是尝试,以确保1不底漆。神奇的部分是反向引用使用的第二部分。(
.. +
?)
\ \ 1 +
先尝试匹配Ñ个字符的长度,然后重复了好几遍\ \ 1 +
。
根据定义,一个素数是一个自然数大于1时,有1以外没有正因子和自身。这意味着,如果A = n * m个再一个是不是一个素数。n * m个可以进一步解释“重复Ñ 米时代“,而这正是正则表达式的功能:匹配ñ使用的字符长度(
.. +
?)
,然后重复米使用时间\ \ 1 +
。因此,如果模式匹配,数不是素数,否则是。提醒!
将扭转的结果。
9。如何分割以逗号分隔的字符串,但忽略了在引号逗号?
你已经达到的地步,正则表达式分解。这是更好,更整洁写一个简单的分配器,并处理特殊情况如你所愿。
或者,您也可以模仿的有限状态机的操作,通过使用一个switch语句或if-else语句。附件是一个代码片段。
10,如何使用反向引用在Java正则表达式
反向引用是Java正则表达式的另一个有用的功能。
英文原文:http://www.programcreek.com/2013/10/top-10-questions-for-java-regular-expression/