2011-08-09 37 views
0

文字列(スペース以外の任意の文字または記号)を長さが10で、少なくとも数字(しかし不確かな場所)と一致させる必要があります。それ。それを行う最も簡単な方法は何ですか?どうも! (好ましくはPerlの正規表現ではなく、本当にすべての正規表現は、その上に光を当てるでしょう。)の要件を満たす固定長と少なくとも1桁の文字列を正規表現するには

いくつかのサンプル文字列:要件を満たしていない

ABCD1EFGH2 
AGD-D.D8HD 
1414151502 
[TT]88daJh 

いくつかのサンプル:

ABCDEFGHIJ  # no digit 
EGEGE_(**/  # no digit 
asdgja8G   # too short 
@#21-GDKJGDE  # too long 

Thx!

更新:これは検索のためのものです。入力文字列には何千もの文字があります。私はそれらの中に数字がある10文字の "単語"をすべて一致させる必要があります。スペースやタブで区切られた上記の8つの単語すべてを含む文字列を考えることができます。最初の4つだけを選ぶ検索が欲しいですか?どうも!

更新の更新:もう一度明確ではないことをお詫び申し上げます(このケースを簡素化したいが、別の解釈を除外しなかった)。この正規表現検索の使用法は、より長い一致の一部になります。例えば。少なくとも数字がの10文字の単語と、それに続く4文字の単語など...長い文字列を最初のステップとして分割すると、うまくいきません。

答えて

4

これは非常に重要な説明です。大きな文字列内で記述する文字列の種類を見つけることは、スタンドアロン文字列を照合することとは非常に異なる作業であり、はるかに複雑です。

/(?<!\S)(?=\S{10}(?!\S))\S*\d\S*/ 

(?<!\S)は非空白文字が付いていない位置に一致します。私はそれを行うための最も簡単な方法は、前後参照してだと思います。

(?=\S{10}(?!\S))は、位置に正確に10個の空白以外の文字が続くことをさらに主張します。

解決策が満たされると、\S*\d\S*が先に進み、少なくとも1文字が数字であると仮定して文字列を消費します。

これはPerlや、Python、Java、.NETなどのほとんどのPerl由来のフレーバーで動作しますが、JavaScriptでは見た目のヒントをサポートしていません。


EDIT:は、ここにPerlですべての一致を反復処理する方法を示す例です:

while ($subject =~ m/(?<!\S)(?=\S{10}(?!\S))\S*\d\S*/g) { 
    print("$&\n"); 
} 

...と、ここでのライブもで議論の最適化が含まれてdemo(コメント)。私は少し異なる正規表現を使用したいJavaScriptでは

var regex = /(?:\s|^)(?=\S{10}(?!\S))([^\d\s]*\d\S*)/g; 
var match = regex.exec(subject); 
while (match != null) { 
    print(match[1]); 
    match = regex.exec(subject); 
} 

(?:\s|^)と後読みの交換は、私は今、先頭の空白文字を消費しています意味します。単語を単独で抽出するには、()で取得し、match[1]で取得します。demo

+1

'\は\ D \ S *'作品* Sけど行いますOPの長い文字列の問題かもしれません。簡単な選択肢は '[^ \ s \ d] * \ d \ S *' –

+0

です@クリス:私は主な点から注意をそらしたくないので、 10文字の "単語"。しかし、もし私がその最適化を追加したいのであれば、[所有量限定子](http://www.regular-expressions.info/possessive.html) - '[^ \ s \ d] * + \ d \ S * '(Perl 5.10+のみ) - または原子グループ(http://www.regular-expressions.info/atomic.html) - '(?> [^ \ s \ d] *)\ d \ S * ' - バックトラックを完全に排除する。 –

0

我々は次のようにJavaScriptで上記目的を達成することができますよう

分割をし、あなたのsourceStringを反復処理:

var string_array=sourceString.split(" "); //split on basis of space 
var arrayIndex=0; 
while (arrayIndex < string_array.length) //iterate 
{ 

    var tempString = string_array[arrayIndex]; 
    if(tempString.length == 10)   //if length is 10 
    { 
     if(tempString.match(/^\d+$/)!= -1) //if it contains more than 1 digit 
     { 
       //do your stuff 
       alert(tempString); 
     } 
    } 
    arrayIndex+=1; 
} 
関連する問題