2017-07-13 5 views
0

私はいくつかのテキストを削除し、文字列から小さなテキストのみを維持しようとしています。
実際、私は正規表現には非常に新しいです、私は記事を読んで、それをうまく理解しませんでした。ここ
は、私はC#で正規表現を使用してそれらを処理し、次のような出力を持つようにしたい私のテキストの例(別の文字列オブジェクト内のすべての行)C#でテキストを処理するRegex

2015-03-08 10:30:00  /user841/column-width 
2015-03-08 10:30:01  /user849/connect 
2015-03-08 10:30:01  /user262/open-level2-price/some other text 
2015-03-08 10:30:01  /user839/open-detailed-quotes 

です:

column-width 
connect 
open-level2-price/some other text 
open-detailed-quotes 

私が使用していますそれを行うためにラインを次が、それは例外をスロー:

Match match = Regex.Match(line, @"*./user\d+/*."); 

例外:

System.ArgumentException: '構文解析"*./user\d+/*." - Quantifier {x,y}は何も表示されません。'

誰でも助けてください!

+1

ようこそ。 [How to Ask](https://stackoverflow.com/help/how-to-ask)と[Minimal、Complete、Verifiableの例](https://stackoverflow.com/help)の作成方法をお読みください。/mcve)。 – numaroth

+0

あなたは「私はいくつかのテキストを削除しようとしています」と言っています。あなたはどうしていますか?なぜそれがうまくいかなかったと思いましたか?この「C#」​​タグを付けましたが、ここにはC#コードはありません。 SOは質疑応答サイトであり、「誰にでも助けてもらえますか?」[https://softwareengineering.meta.stackexchange.com/questions/7273/]の回答はありません。 –

+0

これはRegexを必要としません – maccettura

答えて

3

あなたは.NETの正規表現でエラーと考えられているパターンの開始を定量化しようとすることに起因する誤差が出使用について。おそらく、*.の代わりに.*を使用するつもりでした(できるだけ多くの0+文字に貪欲にマッチさせるために)、期待される結果で判断する必要はありません。1桁以上(を使用する - - /user

  • \d+がリテラルストリング

    • /user

      あなたがregex demo

      詳細を参照してください

      /user\d+/(.*) 
      

      必要NETの正規表現で\dでのみ一致ASCII数字へオプション)

    • / - リテラル/
    • (.*) - いずれかに一致グループ#1を捕捉0+改行以外の文字(+*を置き換えます少なくとも1文字と一致するように)。
  • enter image description here

    のC#:スタックオーバーフロー

    var results = Regex.Matches(s, @"/user\d+/(.*)") 
        .Cast<Match>() 
        .Select(m => m.Groups[1].Value) 
        .ToList(); 
    
    +1

    ありがとう。 :) –

    +0

    はいpfコース、私はあなたの答えに投票しました。 –

    1

    代わりにちょうど'/'文字に分割し、(LINQを使用して)、配列の最後のインデックスを使用して、正規表現を使用する:

    string inputString = "2015-03-08 10:30:01  /user262/open-level2-price"; 
    inputString.Split('/').Last(); 
    

    スプリットは、上記のサンプル入力であなたのケースでは、文字列の配列を返します。あなただけの配列のインデックス.Last()を取るためにLINQを使用するので、あなたは常に最後の部分が欲しい示す

    array[0] = "2015-03-08 10:30:01  " 
    array[1] = "user262" 
    array[2] = "open-level2-price" 
    

    :文字列配列は次のようになります。

    フィドルはhere

    +0

    はい/いいえ、/ user \ d +/*それは良い点ですが、問題は私がスラッシュを持たないテキストを保証するものではありません。 –

    +0

    @ O-BL私は混乱しています、あなたの正規表現は特にスラッシュを探します。スラッシュがそこにあることを保証できないなら、あなたの正規表現はどのように働くでしょうか? – maccettura

    +0

    入力文字列は '2015-03-08 10:30:01/user262/open-level2-price/some other text'のようなものかもしれません。出力はこの' open-level2-price/some other text'したがって、通常の形式は、日付と「ユーザー」の単語、次にユーザーの番号です。 –

    0

    ここRegex.Replace静的メソッドを使用する方法の簡単な例です。私はあなたが正規表現でこの単純なことをやろうとしている理由がわからない

    using System; 
    using System.Text.RegularExpressions; 
    
    public class Program 
    { 
        public static void Main() 
        { 
         string[] lines = new string[] { 
          "2015-03-08 10:30:00  /user841/column-width", 
          "2015-03-08 10:30:01  /user849/connect", 
          "2015-03-08 10:30:01  /user262/open-level2-price", 
          "2015-03-08 10:30:01  /user839/open-detailed-quotes" 
         }; 
    
         string pattern = @"(.*/.*/)(.*)"; 
    
         string replacement = "$2"; 
    
         foreach(var line in lines) 
         { 
          Console.WriteLine(Regex.Replace(line, pattern, replacement)); 
         } 
        } 
    } 
    
    +0

    上記の質問の3番目の例を読むことができますか? –

    0

    https://dotnetfiddle.net/JuUF9Eは、あなただけのラインを読み、「\」で分割する必要があり、彼らは最後のインデックスを選択します以上です。あなたはファイルにそのデータを持っている場合たとえば、あなたはこのようなものを使用することができます

    string newString = ""; 
    StreamReader sr = new StreamReader('log.txt'); 
    while(!sr.ReadLine) 
    { 
        string[] splitted = sr.ReadLine().Split('/'); 
        if(splitted.Length > 0) 
         newString += splitted[splitted.Length - 1]; 
    } 
    sr.Close(); 
    

    終わりを、NEWSTRING変数意志はあなたが望むものを含んでいます。それ以外の場合は、データの一部を行う場合は、リスト内のすべての行を追加できます。

    +0

    上記の質問の3番目の例を読むことができますか? –

    0

    どうLook around

    var line = "2015-03-08 10:30:01  /user839/open-detailed otes/dsada/dsa/das/dsadsa"; 
    
    // dsadsa 
    var match = Regex.Match(line, @"(?!.*/).*").Value; 
    
    +0

    私にエラーが発生します。実際に@WiktorStribiżewは既に質問に答えました。ありがとうございました。 :) –

    +0

    更新、行方不明 "一致" –

    +0

    助けてくれてありがとう、出力文字列は 'open-detailed otes/dsada/dsa/das/dsadsa'であるべきだと思う。 –