5

入力文字列を次のように変換するパターン/マッチャー行があります。

1 3 Hi [2 1 4]

このような配列に:

[0] => "1"
[1] => "3"
[2] => "Hi"
[3] => "2 1 4"

それがコードです:

String input = sc.nextLine();

Pattern p = Pattern.compile("(?<=\\[)[^\\]]+|\\w+");
Matcher m = p.matcher(input);
List<String> cIn = new ArrayList<String>();
while(m.find()) cIn.add(m.group());

のような入力で、負の値を取得できる場合があることに気付きました4 2 -1 2。入力は文字列であるため、正規表現を使用してその負の値を取得することはできません。

以下のコードで、私は使用します

Integer.parseInt(cIn.get(0)); 

その文字列値を整数に変換するには、それが実際に必要です。

-char と number char を一緒に保持できる方法を考えてもらえますか? -次に、数値を変換して を掛ける charがあるかどうかを確認し-1ます。(もっと良い方法があれば、私は聞いてうれしいです)。

いつものように、私の英語ですみません。

4

4 に答える 4

3

正規表現を使用して負の数をキャプチャすることは絶対にできますが、それは何を取り除こうとしているのかによって異なります。

"(?<=\\[)[^\\]]+|[-\\w]+"

最も簡単な方法は、認識された単語文字のグループに「-」を追加することです。ただし、これにより、「9-9」のような奇妙なフォーメーションも合法になります。あなたがすでに「9_9」のようなトークンと一致していることを考えると、それがあなたにとって問題であるかどうかはわかりません。おそらく、この正規表現の最後に別の代替を追加するだけです。

"(?<=\\[)[^\\]]+|\\w+|-?\\d+"

これにより、オプションの「-」文字の後に少なくとも1桁の数字を続けることができます。または、負の数。これはかなり堅牢です。文字通り、追加のタイプの一致(非常に具体的なもの)を定義しているだけですが、新しいケースを見つけるたびに、末尾に「|...」を追加し続けるべきではありません。あなたの正規表現。それはあなたがしていることをするための最も効率の悪い方法についてです。あなたの状況では、これは実際には問題ではないようですが、ユースケースが拡大するにつれてこれについて考える必要があります。

于 2012-11-17T01:05:36.040 に答える
3

方法は次のとおり(?<=\\[)[^\\]]+|-?\\w+です。

-?正規表現は-、単語 ( ) の前にaまたはなしを使用できることを意味しますが、\\w+数字のみが必要な場合は and を使用\\d+\\w+ます。

ここに私が書いたテストがあります:

@Test
public void regex() {

    String input = "-1 3 Hi [2 1 4]";

    Pattern p = Pattern.compile("(?<=\\[)[^\\]]+|-?\\w+");
    Matcher m = p.matcher(input);
    List<String> cIn = new ArrayList<String>();
    while (m.find())
        cIn.add(m.group());

    System.out.println(cIn);

}

[-1, 3, Hi, 2 1 4]期待どおりの結果が得られます。

于 2012-11-17T01:08:35.110 に答える
1

-正規表現でオプションを使用できます。

Pattern p = Pattern.compile("(?<=\\[)[^\\]]+|-?\\w+");
于 2012-11-17T01:05:47.737 に答える
0

非常に洗練された正規表現ですが、あなたがやろうとしていることを捉えるためのトリックが少ないものはどうでしょうか?

(?:\[(?:\s*[-]?\d+\s*)*\]|(?:[-]?\d+|\w+))
于 2012-11-17T01:18:31.223 に答える