1

次の文字列形式を解析する必要があります。

property1 value1
property2 value2
property3 val.ue3

ここで、左の単語はプロパティで、次の単語はその値です。\n値は ( 、\r、 )でトリミングする必要があります

次のコードを使用しています。

Regex reg = new Regex(string.Format("{0}\\s\\w+", propertyName));
string Val = reg.Match(str).Value;

しかし、いくつかの問題があり、それらを解決するのに苦労しています:

  • 値に が含まれている場合、.そこで文字列をトリミングします (たとえば、property3が返されますvalが、 が返されるはずですval.ue3) 。
  • 改行またはスペースの値をトリミングしません(時々返されますvalue2\r
4

5 に答える 5

1

if the value has a "." it trims the string there (i.e for property3 it returns val but it should return value3)

That's because \\w+ matches alphanumeric characters and underscore, it doesn't match dot characters ..

it doesn't trim the value in a new line or a space (sometime it returns - "value2\r")

I can see how this might be happening because as I said above a \\w+ matches word characters so once it spots any other character it stops matching.

A better regex:

Since the name of the property is passed in, we have one task left and that is to match the value, since values are always to end with a newline \n, carriage return \r or dots . then we could match one or more characters that are neither of those to capture the value, something like this:

{0}\\s*([^\\r\\n ]+)
               ^^
          There is a space here, don't forget it

Notice there is a single space after the \\n in the character class above.

RegexHero Demo

于 2013-09-15T15:35:33.750 に答える
0

\wは、任意の文字、数字、またはアンダースコアに一致します (正確な定義については、単語の文字を参照してください)。ただし、リテラルには一致しません.。そのために、 のような文字クラスを使用できます [\w.]

Regex.Escapeまた、次のような他の文字列からパターンを構築する場合は、実際に使用する必要があります。

Regex reg = new Regex(string.Format(@"{0}\s[\w.]+", Regex.Escape(propertyName)));
string Val = reg.Match(str).Value;

または、おそらく省略できますstring.Format

Regex reg = new Regex(Regex.Escape(propertyName) + @"\s[\w.]+");
string Val = reg.Match(str).Value;

@を使用して逐語的な文字列リテラルを作成することに注意してください。\これにより、通常、パターン内でエスケープする必要がないため、正規表現が読みやすくなります。

于 2013-09-15T15:35:08.700 に答える
0

そのために正規表現は必要ないと思います。Splitメソッドはマスタードをカットする必要があります。

string input = 
@"property1 value1 
property2 value2 
property3 val.ue3";
IList<KeyValuePair<string, string>> result =
    (from line in input.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
    let parts = line.Split(' ')
    where parts.Length > 1
    select new KeyValuePair<string, string>(parts[0], parts[1])).ToList();

これで、キーと値のペアを含む結果を使用できます。

property1: value1
property2: value2
property3: val.ue3
于 2013-09-15T15:34:47.233 に答える
0

文字列を辞書に入れて使用する方が適切なようです。

var dict =
    str.Split(new char[] {'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries)
       .Select(x => x.Split(new char[] {' '}, 2))
       .ToDictionary(x => x[0], x => x[1]);

string val = dict[propertyName];

ねえ、それはうまくいきます!

于 2013-09-15T15:32:54.170 に答える