java正则表达式循环匹配_循环浏览正则表达式匹配项并替换
当前匹配项-java
考虑以下字符串:
他点了⼀个凤尾鱼⽐萨。不幸的是,这不是他想要的。此外,蘑菇,意⼤利辣⾹肠和凤尾鱼的⽐萨⽐普通的凤尾鱼⽐萨要好得多。
假设您需要将pizza with (ingredients)更改为pizza with (ingredients) on a thin crust。
为此,我设置了⼀个正则表达式:
(?i:pizza with [a-zA-Z,\s]*?anchovies)
这捕获了三场⽐赛。然后,我继续使⽤以下代码将on a thin crust添加到每个匹配项:
Pattern p = Patternpile("(?i:pizza with [a-zA-Z,\s]*?anchovies)");
Matcher m = p.matcher(string);
while(m.find())
{
string = up(), m.group() + "on a thin crust.");
}
replaceall()这样的输出将是:
他在薄⽪上点了⼀个凤尾鱼薄饼。不幸的是,这不是他想要的。此外,带有蘑菇,意⼤利辣⾹肠和凤尾鱼的⽐萨饼⽐带有薄壳的凤尾鱼⽐萨要好得多。
发⽣了什么:
第⼀个匹配项pizza with anchovies与最后⼀个匹配项相同。因此,使⽤place会使第⼀个和最后⼀个匹配更改为pizza with anchovies on a thin crust。由于我们正在循环浏览所有匹配项,因此最后⼀个匹配项仍将发⽣,并且replace函数也将替换第⼀个匹配项(因为第⼀个匹配项和最后⼀个匹配项相同)。因此,我们得到了双重on a thin crust。
问:
有没有办法仅在当前⽐赛中替换正则表达式⽐赛?
参考⽅案
使⽤replaceAll反向引⽤对整个匹配项使⽤单个$0进⾏操作:
String s = "He ordered a pizza with anchovies. Unfortunately, it wasn't the thing he wanted. Besides, pizza with mushroom, pepperoni and anchovies is much better than the normal pizza with anchovies.";
s = s.replaceAll("(?i)pizza with [a-zA-Z,\\s]*?anchovies", "$0 on a thin crust");
System.out.println(s);
// => He ordered a pizza with anchovies on a thin crust. Unfortunately, it wasn't the thing
// he wanted. Besides, pizza with mushroom, pepperoni and anchovies on a thin crust is
// much better than the normal pizza with anchovies on a thin crust.
见Java demo
这样,您将避免替换已替换的⽂本,因为replaceAll()处理满⾜您的正则表达式模式的⼦字符串的所有,
多个,不重叠的出现。
Java Regex:将整个单词与单词边界匹配 - java
我正在尝试使⽤Java检查字符串是否整体上包含⼀个单词。以下是⼀些⽰例:Text : "A quick brown fox" Words: "qui" - false "quick" -true "quick brown" - true "ox" - fal…java split regex-字符的任意组合 - java
我正在使⽤3个字符分割字符串:空格,破折号和逗号我想要的是能够使⽤这3个字符的任意组合进⾏拆分,例如:-,(破折号后跟逗号)或,--(逗号后加2破折号)或- , -(破折号,逗号间隔破折号)等 String address = "Sector -18B, Dwarka"; String[] addressParts =
address.s…Java RegEx中的单词边界\ b - java
我在使⽤\b作为Java Regex中的单词定界符时遇到困难。对于text = "/* sql statement */ INSERT INTO someTable";
Patternpile("(?i)\binsert\b");不到匹配项Pattern insPtrn = Patternpile(&…Java:线程池如何将线程映射到可运⾏对象 -java
试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执⾏的可运⾏“任务”之间的关系。如果我创建⼀个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务⽆关的“⼯⼈⽆⼈机”可⽤于执⾏任何任务?⽆论哪种⽅式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考⽅案 …JAVA:字节码和⼆进制有什么区别? -java
java字节代码(已编译的语⾔,也称为⽬标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过⼀些书,他们将字节码称为⼆进制指令,但我不知道为什么。 参考⽅案 字节码是独⽴于平台的,在Windows中运⾏的编译器编译的字节码仍将在linux / unix / mac中运⾏。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论