4

指定された文字列

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

数字は最初のドットの後の 2 番目の位置にあることを認識したい

次に、この知識を使用して、「の 2 番目の位置」を置き換えたいと考えています。

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

「こんにちは」で効果的に作る

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

置換は、文字列 a の一致した要素の元の位置に基づいて行う必要があります

正規表現を使用してこれを行うにはどうすればよいですか?

4

3 に答える 3

1

キャプチャグループの番号にアクセスしてこれを置換操作で使用することはできないため、RegExpで実行したいことを直接実行することはできません。

2つの選択肢:

  • 任意のプログラミング言語を使用できる場合:使用する正規表現をグループに分割します。数値識別子の条件に一致するかどうか、各グループを確認してください。b文字列をグループに分割します。対応する一致を置き換えます。

  • いくつかの正規表現のみを使用する場合は、一意の区切り文字を使用してaとbを連結できます(たとえば|)。次に、を一致.*?\.\d+?\..*?|.*?\.(.*?)\..*?させて置き換え$1ます。この正規表現は、1番目の位置、2番目の位置、3番目の位置の3つのバリエーションに適用する必要があります。

于 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

しかし、あなたの目標が2つのドットの間のテキストを置き換えるだけなら、おそらく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

regex2 つのドット (これらのドットを含む) の間のすべての文字を検索するよう指示するため、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+ 

一致グループを使用して番号を取得します。

2番目の正規表現は次のようになります

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

2 番目の文字列の一致グループを取得します。

次に、このようなコードを使用して、一致で好きなことを行います。

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

ここで、patternStr は前述のパターンで、inputStr は入力文字列です。

これのバリエーションを使用して、必要な各組み合わせを試すことができます。一致グループを最初の位置に移動できるので、試してみてください。一致が返された場合は、2 番目の文字列の最初の位置で置換を行います。そうでない場合は、ポジション 2 などに進みます...

于 2012-05-15T21:45:43.373 に答える