2016-07-02 7 views
2

私は1つのワーク21のワーク321ワーク4321作業54321オーバーラップ正規表現を置き換えますか?

仕事を取得する文字列

ワーク1ワーク2ワーク3ワーク4仕事5

を有します

私はこのコマンドを使用しますが、動作しません。

(?<=work\s(\d)+.)(work)(\s\d+) 
    $2$3$1 

問題は、最初の発生後に置き換えられた情報は記録されず、変更が発生するたびに保存することができるということです。

私はあなたが実際に重複正規表現マッチングを必要としない

作品1作品21作品32作品43作品54

+0

あなたのプログラミング言語は何ですか? –

+0

regex c#、sharpdeveloperを使用しています –

+0

「仕事+数字」グループの数が可変である場合、これは1つの正規表現パスでは不可能です。 –

答えて

0

を参照してください。あなたが試すことができ試合を集約Regex.Replaceながら:

String source = "work 1 work 2 work 3 work 4 work 5"; 
    String aggregate = ""; 

    // work 1 work 21 work 321 work 4321 work 54321 
    String result = Regex.Replace(source, @"\d+", // or @"(?<=work\s)\d+" pattern 
    match => aggregate = match.Value + aggregate); 
+0

ありがとう、私はどこで同じような例を読むことができますか? –

+0

@ zero625:すべての答え( 'sln'と' WiktorStribiżew'のもの)は同じ考えを利用します:正規表現+集約; (?<= work \ s)\ d + "'パターンで振り返ってみたときには、* groups *を使用しています。同様の例が他の答えです –

+1

アンアンカーされたlookbehindは、正規表現のパフォーマンスの観点からは多少コストがかかります。そのため、キャプチャグループを使用することができれば、私はいつもそれらから離れることを好みます。また、1桁または0桁の数字にマッチする '\ d +'正規表現は、 "work"の後だけでなく、任意の数字シーケンスと一致します。 @ zero625:BTW、答えが役に立つと判明した場合は、常にそれをupvotingを検討してください。 –

1

を取得し、コマンドを適用すると、あなたが一致できるようにする必要があります各work +スペース+数字を入力し、各繰り返しで更新する数字の値を保存します。

正規表現はただwork (?<num>\d+)になります(workと一致し、スペースが1つ以上、「num」グループに取り込まれます)。

Regex.Replaceメソッド内でコールバックメソッドを使用します。

using System; 
using System.IO; 
using System.Text.RegularExpressions; 
using System.Linq; 
public class Test 
{ 
    public static string num = string.Empty; 
    public static void Main() 
    { 
     var s = "work 1 work 2 work 3 work 4 work 5"; 
     Console.WriteLine(Regex.Replace(s, @"work (?<num>\d+)", Repl)); 
    } 

    public static string Repl(Match m) 
    { 
     num = m.Groups["num"].Value + num; 
     return string.Format("work {0}", num); 
    } 
} 

C# demo

+0

Dmitryとslnは、集約メソッドと匿名メソッドを使用して同一のソリューションを提案します。アイデアは同じです:[MatchEvaluator](https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.matchevaluator(v = vs.110).aspx)デリゲートを使用してnumを更新する変数。 –

関連する問題