1

先読みと後読みを使用して文字列の外側の文字を除外できることは知っていますが、中央の文字についてはわかりません。

私が欲しいのはABCDEF、文字列からの一致を取得することですABC 123 DEF

これは正規表現文字列で可能ですか? そうでない場合、別の方法で達成できますか?

編集

より明確にするために、上記の例では、正規表現文字列/ABC.*?DEF/を使用して必要なものを取得できますが、これには.*?. 私が望むABC(match whatever, but then throw it out)DEFのは、ABCDEF.

別の例として、次のことを実行できます (sudo コードと正規表現で)。

string myStr = "ABC 123 DEF";
string tempMatch = RegexMatch(myStr, "(?<=ABC).*?(?=DEF)"); //Returns " 123 "
string FinalString = myStr.Replace(tempMatch, ""); //Returns "ABCDEF". This is what I want

繰り返しますが、単一の正規表現文字列でこれを行う方法はありますか?

4

2 に答える 2

3

ほとんどの言語の正規表現置換機能は、操作対象の文字列を変更しない (ただし、新しい文字列を生成する) ため、ほとんどの言語でワンライナーとして実行できます。まず、必要な部分をキャプチャして、すべてを一致させます。

^.*(ABC).*(DEF).*$

(入力に改行が含まれている場合は、必ず single-line/"dotall" オプションを使用してください!)

そして、これを次のように置き換えます。

$1$2

それはあなたABCDEFに1つの課題を与えます。

それでも、コメントとマークの回答で概説されているように、エンジンABCと の間のものと一致しDEFます。それを捨てるのは、交換用の便利な関数だけです。しかし、それはほとんどすべての言語でサポートされています。

重要:このアプローチはもちろん、入力文字列に目的のパターンが 1 回だけ含まれている場合にのみ機能します (ABCDEFが実際に可変であると仮定します)。

PHP での実装例:

$output = preg_replace('/^.*(ABC).*(DEF).*$/s', '$1$2', $input);

または JavaScript (単一行モードを持たない):

var output = input.replace(/^[\s\S]*(ABC)[\s\S]*(DEF)[\s\S]*$/, '$1$2');

または C#:

string output = Regex.Replace(input, @"^.*(ABC).*(DEF).*$", "$1$2", RegexOptions.Singleline);
于 2012-12-03T22:15:18.950 に答える
2

正規表現には、複数のキャプチャ グループを含めることができます。各グループは連続した文字で構成されている必要があるため、単一のグループで目的のものをキャプチャすることはできませんが、グループ自体は連続している必要はないため、複数のグループを組み合わせて目的の結果を得ることができます。

正規表現

(ABC).*(DEF)

キャプチャ

ABC
DEF

オンラインで見る: rubular

C# コードの例

string myStr = "ABC 123 DEF";
Match m = Regex.Match(myStr, "(ABC).*(DEF)");
if (m.Success)
{
    string result = m.Groups[1].Value + m.Groups[2].Value;  // Gives "ABCDEF"
    // ...
}
于 2012-12-03T21:50:46.353 に答える