java – 如何使用正则表达式计算元素相对于另一个元素的位置?

给定字符串

//          1       2       3
String a = "letters.1223434.more_letters";

我想知道在第一个点之后数字位于第二位

然后我想利用这些知识取代“第二位”

//          1         2           3
String b = "someWords.otherwords.morewords";

用“你好”来有效地制作

//          1         2     3
String b = "someWords.hello.morewords";

必须根据String a中匹配元素的原始位置进行替换

如何使用正则表达式来完成?

最佳答案 要查找这些数字,您可以使用组机制(常规表达式中的圆括号):

import java.util.regex.*;

...

String data = "letters.1223434.more_letters";
String pattern="(.+?)\\.(.+?)\\.(.+)";
Matcher m = Pattern.compile(pattern).matcher(data);
if (m.find()) //or while if needed
    for (int i = 1; i <= m.groupCount(); i++) 
    //group 0 == whole String, so I ignore it and start from i=1
        System.out.println(i+") [" + m.group(i) + "] start="+m.start(i));
// OUT:
//1) [letters] start=0
//2) [1223434] start=8
//3) [more_letters] start=16

但如果您的目标只是在两个点之间替换文本,请尝试在String对象上使用replaceFirst(String regex,String replacement)方法:

//find ALL characters between 2 dots once and replace them 
String a = "letters.1223434abc.more_letters";
a=a.replaceFirst("\\.(.+)\\.", ".hello.");
System.out.println(a);// OUT => letters.hello.more_letters

正则表达式告诉搜索两个点之间的所有字符(包括这些点),因此替换应该是“.hello”. (带点).

如果你的String有更多的点,它将替换第一个和最后一个点之间的所有字符.如果您希望正则表达式搜索满足模式所需的最少字符数,则需要使用Reluctant Quantifier – >?喜欢:

String b = "letters.1223434abc.more_letters.another.dots";
b=b.replaceFirst("\\.(.+?)\\.", ".hello.");//there is "+?" instead of "+"
System.out.println(b);// OUT => letters.hello.more_letters.another.dots
点赞