0

私のプロジェクト(php)では、次のような正規表現(pcre)を取得しました:

preg_match('/[\s^0-9]{0,1}([0-9]{2})[\s^0-9]{0,1}/',$chanson['nom'],$resultPreg1)

この正規表現は、1つのスペースで区切ることも、区切ることもできない2つの数値をキャッチし、数値で区切ることはできません。私がやりたいのは、最初にスペース(そして数字なし)があるか、最後にスペース(そして数字なし)があるということです。ただし、少なくとも1つの区切り文字が必要です。

これどうやってするの ?

4

2 に答える 2

1

分割して各ケースをテストするだけです。

/\s\d{2}\D|\D\d{2}\s/

これは、スペース、2 つの数字、および数字以外の任意の文字、または数字以外の文字、2 つの数字、およびスペースに一致します。

注:\dは数字で、 と同等[0-9]です。 \Dは非数字で、 と同等[^0-9]です。

ただし、上記の正規表現では、数値の両側に少なくとも 1 つの非数字が必要です。また、 のようなパターンがある場合.11 22.、最初の一致でスペースが食い尽くされるため、両方の数字には一致しません。これが問題になる場合は、ルックアラウンドを使用できます。

/\s\d{2}(?!\d)|(?<!\d)\d{2}\s/

これはスペースに一致し、次に別の数字が続かない2 桁の数字、または数字が先行しない 2 桁の数字の後にスペースが続きます。

(?!...)否定先読みです。「これでは試合が続かない」という意味です。

(?<!...)は否定の後読みであり、「マッチの前に this を置くことはできない」ことを意味します。

于 2013-02-26T11:31:52.280 に答える
0

1 組の角括弧内に負の文字クラスと正の文字クラスを混在させることはできません。「スペース」または「数字ではない」を書くことができます\s|[^0-9]。ただし、スペースは数字ではないため、特別に入れる必要はありません。それで[^0-9]十分です。の「ゼロまたは1」の構文{0,1}は技術的には正しいですが、同じことにはもっと簡潔な構文があります: ?.

preg_match('/[^0-9]?([0-9]{2})[^0-9]?/',$chanson['nom'],$resultPreg1)

「abc23def」のような文字に埋め込まれた数字が見つからない場合を除いて、探しているものを取得するために数字の前後に単語区切りを使用することがほとんどできます。

preg_match('/\b([0-9]{2})\b/',$chanson['nom'],$resultPreg1)
于 2013-02-26T11:35:53.523 に答える