1

次の正規表現があります。

"\[(\d+)\].?\s+(\S+)\s+(\/+?)\\r\n"

私は正規表現にかなり慣れていません。この正規表現と、一致するかどうかを確認しようとしている文字列があります。私はそれが一致するはずだと信じていますが、私のプログラムはそれが一致しないと言っており、オンラインアナライザーはそれらが一致しないと言っています。私は何か小さなものが欠けていると確信しています。これが私の文字列です:

[1]+ Stopped    sleep 60

しかし、このオンラインツールを使用して一致をチェックする場合(そして私のプログラムはそれらが等しくないと言っている)、なぜ次の式が上記の正規表現と一致しないのですか?何か案は?

4

3 に答える 3

1

\ rの前に\をエスケープしたため、文字rが検索されたようです。

于 2012-10-07T20:45:42.687 に答える
0

このパターンを使用してみてください:

\[\d+\]\+\s*\w+\s*\w+\s*\d+
于 2012-10-07T20:44:10.353 に答える
0

RegExpの解釈と許可される文字は実装によってわずかに異なるため、実行コンテキストを指定する必要がありますが、これはおそらく十分に一般的です。

正規表現を分解すると

\[     - an open bracket character. 
(\d+)  - one or more digits; save this as capture group 1 ($1).
\]     - a close bracket character.
.?     - 0 or 1 character, of any kind
\s+    - 1 or more spaces.
(\S+)  - 1 or more non-space characters; save this as $2
\s+    - 1 or more spaces
(\/+?) - 1 or more forward-slash characters, optional as $3
         (not sure about this, this is an odd construct)
\\r\n" - an (incorrectly specified) end of line sequence, I think.

まず、行末を一致させる場合は、\ r\nではなく$を使用します。これは、ほとんどのコンテキストで行の終わりと一致する必要があります。^は行の先頭に一致します。

次に、「Stopped」という単語の後に何をキャプチャしようとしているのかを正規表現から判断できないため、内部スペースを含め、残りを1つのブロックとして使用することを想定します。基本的にあなたと同じreg-expがそれを行います。

"\[(\d+)\].?\s+(\S+)\s+(.+)\s*$"

これはキャプチャします

$1 = 1,
$2 = Stopped
$3 = sleep 60

これは基本的にあなたと同じですが、最後まで「停止」した後、先頭と末尾の空白を除いて、単一のキャプチャグループ$3としてすべてを取得します。追加の解析を行う場合は、必要に応じて(。+)を置き換えます。これが一致するためには、「停止」の後に少なくとも1つの非空白文字が必要であることに注意してください。文字列$3がなくても一致させたい場合は、\s*(.*)\s*$代わりにを使用してください\s+(.+)\s*$

于 2012-10-07T21:22:47.470 に答える