2016-09-14 5 views
1

数字以外の数字を含む数字の文字列を一致させようとしています。 http://regexr.com/のデフォルトのテキストを使用して、以下が一致する必要があります:埋め込み数字に数字以外の数字が埋め込まれています

v2.1 
-98.7 
3.141 
.6180 
9,000 
+42 
555.123.4567  
+1-(800)-555-2468 

を以下のはずない試合:


12345 

私が試した:

/[^\n\ ]{1,}\d+\S+\d/g 

しかし、それは+42と一致しません12345と間違って一致し、"555.123.4567 +1-(800)-555-2468"を1つの文字列として使用します。

最後に$を入れて、それを緩和しようとしましたが、何も一致しませんでした。私が間違っていることを確認していない。

答えて

2

あなたは、少なくとも1つの非桁で任意のテキストを一致させるために、この正規表現を使用することができます。

/^\d*[^\d\n]+\d.*$/mg 

RegEx Demo

正規表現の分裂:

  • ^ -
  • 開始します\d* - 0桁以上の数字に一致する
  • [^\d\n]+ - マッチ1以上の任意の文字数字ではなく改行
  • \dではありません - マッチ桁
  • .* - マッチ0または任意の文字
  • $のより - エンド
+0

これは、数字以外の文字列にも一致するとコメントする必要があります。文のように。 – revo

+0

タイトルは*埋め込まれた数字と非数字の一致*。だから、私は提案された正規表現は、数字のない行には全くマッチしないべきだと思います。あなたは 'test'とマッチします。 – revo

+0

はい、それは混在しているようです。 – revo

0

これを試してみてください:

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

これは、少なくとも」を意味し、O 1桁と1桁で、空白はありません。

live demoを参照してください。


何の改行があなたの入力でなかった場合、あなたは少し単純に使用することができます:あなたは数字の、または完全に文字のみで構成さかわすの文字列にしたいよう

^(?=.*\d)(?=.*\D)\S+$ 
+0

最初の正規表現は数字のみの文字列と一致しますが、2番目の正規表現はOKです。 – revo

+0

@revo改行がない場合、最初のものが動作します - [live demo](http://rubular.com/r/v75FK3nMnV) – Bohemian

+0

を参照してください。 ?^(?=。* \ d)(?=。* \ d)\ S + $ ' – revo

0

が見えます。だからあなたはそれらを除外することができます。それはまた、の文字列ではなく、の数字になるので、数字も必要です。

他の文字を除外する必要がある場合は(アンダースコア?)、リストに追加します。

入力がどのようになっているかは不明です。これには準備ができている文字列のリストがあります。入力に応じて単語の境界や/sを追加します。または、入力を解析して文字列のリストにします。


入力が複数行の文字列の場合は、my @strings = split '\n|\s+', $text;となります。

0

これは大雑把に考えていませんか? /\D/を使用して、数字が含まれていない文字列と一致すると何が問題になりますか?

あなたの正確な要件はわかりませんが、少なくとも1桁と少なくとも1桁の数字が含まれている文字列を検索する場合、最も簡単な方法は正規表現の正規表現に使用することです - /\d/ && /\D/

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

while (<DATA>) { 
    chomp; 
    say "$_: " . (/\d/ && /\D/ ? 'matches' : 'doesn\'t match'); 
} 

__DATA__ 
v2.1 
-98.7 
3.141 
.6180 
9,000 
+42 
555.123.4567 
+1-(800)-555-2468 

12345 
関連する問題