4

给定字符串

//          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 中匹配元素的原始位置进行替换

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

4

3 回答 3

1

您想要做的事情在 RegExp 中无法直接实现,因为您无法访问捕获组的编号并在替换操作中使用它。

两种选择:

  • 如果您可以使用任何编程语言:将使用正则表达式拆分为组。检查每个组是否符合您的数字标识符条件。将 b 字符串分成组。替换对应的匹配项。

  • 如果您只想使用多个正则表达式,那么您可以使用唯一的分隔符(比如说 |)连接 a 和 b。然后匹配.*?\.\d+?\..*?|.*?\.(.*?)\..*?和替换$1。您需要在第一个位置、第二个位置、第三个位置的三个变体中应用这个正则表达式。

于 2012-05-15T21:53:01.080 回答
1

为了找到这些数字,您可以使用组机制(正则表达式中的圆括号):

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

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

//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

regex告诉搜索两个点之间的所有字符(包括这些点),所以replacement应该是“.hello”。(带点)。

如果您的字符串将有更多点,它将替换第一个和最后一个点之间的所有字符。如果您希望正则表达式搜索满足模式所需的最少字符数,您需要使用 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
于 2012-05-16T00:30:07.600 回答
0

字符串 a 的正则表达式是

\w+\.(\d+)\.\w+ 

使用匹配组来抢号码。

第二个的正则表达式是

\w+\.(\w+)\.\w+

获取第二个字符串的匹配组。

然后使用这样的代码来做你喜欢的比赛。

Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.find();

其中 patternStr 是我上面提到的模式, inputStr 是输入字符串。

您可以使用它的变体来尝试您想要的每种组合。所以你可以将匹配组移动到第一个位置,试试看。如果它返回匹配项,则在第一个位置的第二个字符串中进行替换。如果没有,请转到位置 2,依此类推...

于 2012-05-15T21:45:43.373 回答