2

文字列に含まれる関数を「評価」するには、非常に複雑な文字列を解析する必要があります。「抽出」する関数は1つだけで、次の特定のsintaxがあります。

LOC_POS(number;number);

この文字列は、次のようなHTMLページに含まれています。

something here LOC_POS(45;9);Some string or html content <br> here LOC_POS(45.21312;9.1232123);LOC_POS(45,32;9,12); some other string...

(数字は座標であり、関数はこの正規表現によって認識されます:

LOC_POS\([ 0-9.,]+;[ 0-9.,]+\);

C#ですべてのブロックを抽出するにはどうすればよいですか?私が欲しい結果は、(アイテムごとに1行)を含む配列です。

something here 
LOC_POS(45;9);
Some string or html content <br> here 
LOC_POS(45.21312;9.1232123);
LOC_POS(45,32;9,12); 
some other string...

私は通常の文字列解析でそれを行う方法を知っています。

4

4 に答える 4

1

これが私が思いついたものです。

        string str = @"something here LOC_POS(45;9);Some string or html content <br> here LOC_POS(45.21312;9.1232123);LOC_POS(45,32;9,12);  some other string...";
        Regex test = new Regex(@"(LOC_POS\([\d\.,]+;[\d\.,]+\);)");
        string[] segments = test.Split(str);
        StringBuilder sb = new StringBuilder();
        foreach (string s in segments)
            if(!String.IsNullOrEmpty(s))
                sb.AppendLine(s);
        textBox1.Text = sb.ToString();

出力結果

something here 
LOC_POS(45;9);
Some string or html content <br> here 
LOC_POS(45.21312;9.1232123);
LOC_POS(45,32;9,12);
 some other string...

正規表現はLOC_POSの各インスタンスを検出し、分割によって文字列がセグメントに分割されます。次に、文字列ビルダーを使用して文字列を再構築し、すべての改行を適切な場所に配置します。実際に必要な場合は、これを使用してLOCブロックの個々のインスタンスをキャプチャすることもできます。全体のキャプチャグループは、LOCブロックが無視されるのではなく、実際に配置されることを確認することです。

于 2012-06-01T18:48:53.477 に答える
0

((.*?)(LOC_POS\([\d\.,]+;[\d\.,]+\);))

それはいくつかのグループをキャプチャします。最初のサブグループは、LOC_POSの前の文字列になります。ここで正規表現。

グループ1:フルストリング

グループ2:LOC_POSの前の文字列

グループ3:LOC_POS呼び出し

于 2012-06-01T15:20:53.707 に答える
0

これはどう:

string str = @"something here LOC_POS(45;9);Some string or html content <br> here LOC_POS(45.21312;9.1232123);LOC_POS(45,32;9,12);  some other string...";
string rgx = @"\s*(LOC_POS\([ 0-9.,]+;[ 0-9.,]+\);)\s*";

str = Regex.Replace(str, rgx, @"##$1##");
//Console.WriteLine("str= " + str);

string[] lines = str.Split(new string[] {"##"}, StringSplitOptions.RemoveEmptyEntries);

foreach(string s in lines) {
    Console.WriteLine(s);
}
Console.ReadKey();

最初に、要素の周りに任意の分割シーケンス(使用##しましたが、任意に変更できます)を配置します(空白をキャッチする正規表現を使用)。LOC_POS次に、空のエントリを処理するように、上記の分割シーケンスで文字列を分割します。ブーム、完了。

于 2012-06-01T15:52:36.447 に答える
-1
var content = "....";
var regex = new Regex(@"LOC_POS\([ 0-9.,]+;[ 0-9.,]+\);");
var matches = regex.Match(content);
于 2012-06-01T15:20:50.343 に答える