2

文字列式のトークンを分離しようとしています。式は次のようになります。

-1-2+-3

これは私が使用している正規表現です:

[\d\.]+|[-][\d\.]+|\+|\-|\*|\/|\^|\(|\)

これにより、次の一致が得られます。

-1
-2
+
-3

私は期待していました:

-1
-
2
+
-3

負の数を演算子と区別するにはどうすればよいですか?

4

2 に答える 2

3

多分あなたはこれを試すことができます; 後読みを利用します。

((?<=\d)[+*\/^()-]|\-?[\d.]+)

ここでテストしました。

基本的に、演算子の前に数字があることを確認して、何を一致させるかを決定します。そのため、演算子の前に数字がある場合は、演算子だけを扱います。それ以外の場合は、マイナスと数字を結合します。

編集: 念のため、ブラケットをロットから分離しました ( demo ):

((?<=\d)[+*\/^-]|[()]|\-?[\d.]+)
于 2013-08-09T18:20:48.163 に答える
1

このパターンは、あなたが探していることをするはずです:

^(?:(?<num>-?[\d\.]+)(?:(?<op>[-+*/^])|$))+$

例えば:

var input = "-1-2+-3";
var pattern = @"^(?:(?<num>-?[\d\.]+)(?:(?<op>[-+*/^])|$))+$";
var match = Regex.Match(input, pattern);
var results =
    from Group g in match.Groups.Cast<Group>().Skip(1)
    from Capture c in g.Captures
    orderby c.Index
    select c.Value;

生産します:

-1 
- 
2 
+ 
-3 
于 2013-08-09T18:27:47.967 に答える