Java正则表达式的十大问题
伙伴们注意了!
小编在这里给大家送上关注福利:
转发本文,关注“速学Java”公众号即可领取小编精心准备的资料一份!
本文总结了有关Java正则表达式的常见问题。
由于它们是最常用的,你可能会发现它们也非常有用。
ns表示Java正则表达式
1. 如何从字符串中提取数字?
使用正则表达式的一个常见问题是将所有数字提取到整数数组中。
在Java中,\d表示数字范围(0-9)。
尽可能使用预定义的类将使您的代码更易于阅读,并消除由畸形字符类引入的错误。
有关详细信息,请参阅预定义的字符类。
请注意\d中的第一个反斜杠。
如果在字符串文字中使用转义结构,则必须在反斜杠前面加上另一个反斜杠,以便编译字符串。
这就是为什么我们需要用\\d。
2. 如何用换行符拆分Java字符串?
根据所使用的操作系统,至少有三种不同的方式可以输入新行字符。
因此,按新行分割字符串最直接的方法是
但是如果你不想要空行,你可以使用,这也是我最喜欢的方法:
下面是一种更健壮的方法,它实际上是独立于系统的。
但是请记住,如果两个换行符并排放置,仍然会得到空行。
指定为字符串的正则表达式必须首先编译为Pattern类的实例。
编译()方法是创建对象实例的唯一方法。
典型的调用序列是这样的
本质上,Pattern.compile()用于将正则表达式转换为有限状态机(参见编译器:原理、技术和工具(第二版))。
但是执行匹配所涉及的所有状态都驻留在匹配器中。
通过这种方式,可以重用模式p。
许多牌手可以共享相同的模式。
matches()方法被定义为仅在使用正则表达式一次时使用的一种便利方法。
该方法仍然使用compile()隐式地获取模式的实例,并匹配字符串。
因此,它等价于上面的第一个代码,尽管对于重复匹配,它的效率较低,因为它不允许重用已编译的模式。
4. 如何转义文本为正则表达式?
通常,正则表达式使用“\”来转义结构,但是在反斜杠前面加上另一个要编译的Java字符串是很痛苦的。
用户还可以通过另一种方式将字符串文本传递给模式,比如“$5”。
不用写\\$5或[$]5,我们可以打字
5. 为什么String.split()需要转义管道分隔符?
split()在给定正则表达式的匹配项周围拆分字符串。
Java表达式支持影响模式匹配方式的特殊字符,这称为元字符。
|是一个元字符,用于从多个可能的正则表达式中匹配单个正则表达式。
例如,|b的意思是A或B。有关详细信息,请参阅与竖条或管道符号的交替。
因此,要使用|作为文字,您需要通过在它前面添加\\|来转义它。
6. 如何将anbn与Java正则表达式匹配?
这是所有非空字符串的语言,这些字符串由一定数量的a后跟相同数量的b组成,如ab、aabb和aaabbb。
这种语言可以显示上下文无关文法年代→aSb | ab,因此一种非正式语言。
然而,Java regex实现可以识别的不仅仅是常规语言。
也就是说,根据形式语言理论的定义,它们不是“规则的”。
使用前瞻性和自引用匹配就可以实现。
在这里,我将首先给出最后的正则表达式,然后稍微解释一下。
全面的解释,我会参考您阅读我们如何匹配^ n b ^ n与Java正则表达式。
与其解释这个复杂正则表达式的语法,我更愿意介绍一下它是如何工作的。
在第一次迭代中,它在第一个a处停止,然后向前看(通过使用a*跳过了一些)是否有一个b。这是通过使用(?:a(?)
= *(\ \ 1 ? + b)))。
如果它匹配,\1,自引用匹配,将匹配非常内圆括号元素,这是第一次迭代中的单个b。
在第二次迭代中,表达式将在第二次a处停止,然后它向前看(再次跳过as),看看是否会有b。但这一次,\\1+b实际上等于bb,因此必须匹配两个b。
如果是,\1将在第二次迭代后更改为bb。
在第n次迭代中,表达式停在第n个a处,看看前面是否有n个bs。
通过这种方式,表达式可以计算a的数量,如果b后面跟着a的数量相同,则进行匹配。
7. 如何将字符串中的两个或多个空格替换为单个空格并仅删除前导空格?
replaceall()用给定的替换替换与给定正则表达式匹配的每个子字符串。
“2个或多个空格”可以用正则表达式[]+表示。
因此,下面的代码可以工作。
请注意,该解决方案最终不会删除所有前导和尾随的空白。
如果希望删除它们,可以在管道中使用String.trim()。
8.如何使用正则表达式确定一个数字是否是素数?
该函数首先生成n个字符,并尝试查看该字符串是否匹配。?|(..+?)\\1+。
如果是素数,表达式将返回false和!
会反转结果。
第一部分。
确保1不是引物。
魔术部分是使用反向引用的第二部分。
(..+?)\\1+先尝试匹配n个字符长度,然后用\\1+重复几次。
根据定义,素数是大于1的自然数,除1和它自身外没有正因子。
这意味着如果a=n*m那么a不是素数。
n*m可以进一步解释为“重复n m次”,这正是正则表达式所做的:使用(..+?)匹配n个字符长度,然后使用\\1+重复m次。
因此,如果模式匹配,则数字不是素数,否则就是素数。
提醒!
会反转结果。
9. 如何分割逗号分隔的字符串,但忽略引号中的逗号?
您已经到了正则表达式崩溃的地步。
编写一个简单的拆分器更好,也更整洁,可以按照您的意愿处理特殊情况。
另外,您可以使用switch语句或if-else来模拟有限状态机的操作。
附件是一段代码。
10. 如何在Java正则表达式中使用反向引用
反向引用是Java正则表达式中的另一个有用特性。