アレルギー対策、自宅でできる効果的な方法とは?

if($a =~「1~20」までの数字又は「1_1~1_20」~「20_1~20_20」までの数字){
OK;
}else{
NO;
}

を正規表現や条件分岐を使って範囲指定したいのです。

[1-9]
ですと111等も対象になりますし、{n,}とした場合でも数値の1~20までとは出来ないようで・・・。
また正規表現では_の扱いが今一わからない状況で
更に()と?を使って思考錯誤を繰り返しているうちに
[]//の用途がだんだんと分からなくなってしまいました。

各用途については調べ整理しているつもりなのですが
今回のようなケースに関して参考になる例を見つけられず質問させて頂きました。

ご掲示頂けませんでしょうか。宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

面倒ではあるのですけど、この程度までなら、正規表現だけでなんとかなります。


1~20の数字を表す正規表現は・・
(?<!\d)([1-9]|1[0-9]|20)(?!\d)

連続した数字だけを取り出すために、ゼロ文字幅アサーションを利用するのが、ポイント。あんまり初心者向けの解説には載ってないので、こういう際に覚えてしまいましょう。
あとは、組み合わせてやってみてください。
    • good
    • 0
この回答へのお礼

ご返信の方遅くなったんですけれども、参考になる例とあわせて素早いご反応を頂き有難うございました。

また更にアサーションという概念がある事を知る機会を頂きましてありがとうございました。この件についてはまたおりをみて調べ取り組みたいと思います。

今回はご掲示頂きました正規表現で1~20までの数を対象にできた事は私には凄く感動的でした。

試しに自分で試行錯誤してみたのですが、1_20や1_2_3などまでひっかかってしまうようでした。

自分としてはイメージ的には下記のような形を想定しているのですが、まだ良くわかっておらず認識のあまさからうまく機能しないみたいです。
(?<!\d)([1-9]|1[0-9]|20)(?!\d)?(_)?(?<!\d)([1-9]|1[0-9]|20)(?!\d)

もしまたお時間などございましたら、アドバイスなど頂けましたら幸いです。

今回は大変参考になるご意見有難うございました。

お礼日時:2005/05/09 00:05

すでに丁寧な回答が寄せられているのですが、私は以下のような場合にわけて考えました。


(1)変数 $a の中が数字だけの場合
(2)変数 $a の中が「数字_数字」の形の場合
さらに、(1)の場合、その数字が1から20の範囲か、また、(2)の場合については、2つの数字が両方とも範囲内か、を調べるようにします。


if( ( $a=~/^(\d+)$/ && # (1)
   $1>=1 && $1<=20 ) ||
  ( $a=~/^(\d+)_(\d+)$/ && # (2)
   $1>=1 && $1<=20 &&
   $2>=1 && $2<=20
  ) ) {
 printf("yes\n");
} else {
 printf("no\n");
}

もしくは、

if( ( $a=~/^(\d+)(_(\d+))?$/ &&
   $1>=1 && $1<=20 &&
  ( $2 eq "" || $3>=1 && $3<=20 )
 ) {
 printf("yes\n");
} else {
 printf("no\n");
}
    • good
    • 0
この回答へのお礼

お忙しい所、貴重なご意見有難うございました。

私のほうで試行錯誤を重ねてみたのですが、折角ご掲示頂いた上記の2点の例はエラーになり自力では動作確認をする事ができませんでした。

この度はお時間割いてご掲示頂きまして有難うございました。

お礼日時:2005/05/09 00:33

#1の方と同じです


if($a =~ /^(?:[1-9]|1\d|20)(?:_(?:[1-9]|1\d|20))?$/){
    • good
    • 0
この回答へのお礼

お忙しい中とても参考になる形でご掲示頂きまして、本当に有難うございました。

当初希望していた問題を解決できました。

各細部についての意味につきましては、おおよその検討しかつけようがないのですが、今回を機に正規表現について改めて調べ再勉強する良い機会になりました。

今後も事あるごとに振り返り、長期的な視野で正規表現を自分のものにしてゆけるよう頑張って参りたいと存じます。
この度は本当に感謝の気持ちでいっぱいです。
有難うございました。

お礼日時:2005/05/09 00:44

#3>各細部についての意味


/^(?:[1-9]|1\d|20)(?:_(?:[1-9]|1\d|20))?$/
/^~$/
^:先頭から
$:最後尾までの間
にある、つまり、今回の対象文字列だけが入っている。(他の文字列に埋もれているのを対象としているのではない)
(?:~):グループ化する、()と違うのは$1などに値を設定しないこと、単にグループ化する時に使う。
[1-9]:1から9までの一文字を表す
\d:[0-9]の意味
[1-9]|1\d|20:|は、orの意味、1~9であるか10~19(1で始まる0~9)であるか20であるの意味
(~)?:~が0回または1回ある
    • good
    • 0
この回答へのお礼

お忙しい中、親切丁寧にご解説頂きまして本当に有難うございます。

本当に本当に感謝の気持ちで一杯です。

最初解説頂いてる部分を拝見した時、
^:先頭から・・・の:がえ?
更に
$:の:も、ん?・・・みたいに思ったのですが、

アサーションを利用した形のグルーピングの使い方
や、_を(?:_(~))とする辺りは思わず、「そっか~なるほど~」と思わされる瞬間でつい感動してしまいました。

この辺りは自分の経験の浅さから考えがそこまで及ばず中々自分の主観からは逃れられないもんだなぁ・・と自覚さえしてしまいますが、同時に凄いなぁ~有り難いな~と思う反面認識が広がった事に感動してしまいました。

この度はご教授頂きました事、本当に感謝しています。

有難うございました!!

お礼日時:2005/05/09 17:22

No.2 です。

プログラムが動作しなかったとのこと、失礼しました。

後者のプログラムについては、"if( (" の2つの左カッコのうちひとつが余計でした。また、プログラムを投稿する際に、インデントをそろえるために各行のはじめの空白文字に全角を使ったことも問題の一つであったのかもしれません。

いずれにしても、失礼しました!
    • good
    • 1
この回答へのお礼

お忙しい中、わざわざご連絡有難うございます。

ご掲示頂きました内容を再度確認しました所、
前者のは仰る通り全角の空白の為だったようです。
後者のも仰る通りで(が一つ余分と全角の空白になっていたようでした。

内容については、正規表現部分につきましてはBLUEPIXY様のご解説を前提にしている事もあり理解しやすいプログラム内容と拝見する事ができました。

また考え方としまして例を2例もあげて頂き、正規表現だけで解決するのではなく条件分岐を取り入れた形で実現して頂き凄く感謝していますしとても参考になっています。

私自身まだまだ初歩的な事を見落としていて恥かしい限りですが、今回の件を良い機会と受け止め今後の励みに頑張りたいと思います。

この度はbender様にも感謝の気持ちで一杯です。

最後までお付き合い頂き有難うございました!

お礼日時:2005/05/09 18:13

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q[正規表現] 数字範囲をヒットさせたい。

すいません。
教えて下さい。

1024~65535までの数字範囲を正規表現でヒットさせたいです。
得に言語は問いませんが、私はVBSで実装しようとしています。

よろしくお願いします。

Aベストアンサー

この質問は、質問者さんがフィードバックするわけでもないし、回答側がいろんな想像をしながら、回答しているわけで、これも、その一つなんでしょうけれどもね。

でも、#3でもかきましたが、Perl を使えとまでは言いませんが、テキストファイルなら、grep で十分なのですね。windows用のgrep というのもあります。しかし、kwic(key word in context)のコンコーダンスを作る目的なら、話は違ってきます。

'//Wscript で、argumentは、ドラッグして入れてください。
'//
Dim Matches
Dim Match
Dim objFso
Dim objTxIn
Dim TxIn
Dim Tx
Dim fname
Dim buf

Set objFso = CreateObject("Scripting.FileSystemObject")
If WScript.Arguments.length =0 Then
WScript.Echo "ファイルをドラッグして、このファイル名にDropしてください。"
WScript.Quit
End If
fname =WScript.Arguments.Item(0)
If objFso.GetExtensionName(fname) = "txt" Then
Set objTxIn = objFso.OpenTextFile(fname)
Tx = objTxIn.ReadAll()
Else
WScript.Echo "拡張子がtxtではありません。"
WScript.Quit
End If
With CreateObject("VBScript.RegExp")
.Pattern = "\b([\d,]{4,6})\b"
.Global = True
Set Matches = .Execute(Tx)
For Each Match In Matches
buf = buf & " " & CheckFigures(Match.Value)
Next
End With
If Trim(buf) <> "" Then
WScript.Echo buf
End If

Function CheckFigures(byval num)
Dim num2
If IsNumeric(num) Then
num2 = CLng(num)
If num2 >=1024 And num2 <=65535 Then
CheckFigures =num
Else
CheckFigures =""
End If
End If
End Function
'///

この質問は、質問者さんがフィードバックするわけでもないし、回答側がいろんな想像をしながら、回答しているわけで、これも、その一つなんでしょうけれどもね。

でも、#3でもかきましたが、Perl を使えとまでは言いませんが、テキストファイルなら、grep で十分なのですね。windows用のgrep というのもあります。しかし、kwic(key word in context)のコンコーダンスを作る目的なら、話は違ってきます。

'//Wscript で、argumentは、ドラッグして入れてください。
'//
Dim Matches
Dim Match
Dim objFso...続きを読む

Q正規表現でAND検索はできるのでしょうか

正規表現でAND検索はできるのでしょうか?

現在ASPでデータベースのデータを検索しようとしているのですが,検索エンジンみたいに複数の語をスペースで区切って入力して,データを絞り込んで表示したいのです。

OR検索みたいにそれぞれの語を"|"でつなぐというようなやり方があるのでしょうか?
それとも一つ一つの語で検索を繰り返すという方法しかないのでしょうか?

ご存知の方,ご教授ください。

Aベストアンサー

&&でつながれたらいかがですか?

(?=.*stat)(?=.*ate)はAND検索という意味ではありません。
statedのようにstatとateを重複して含む単語にマッチするという意味です。

普通はこんな回りくどいことはせず、
/stat/ && /ate/
で済ませると思います。
(もしくは単純にループでまわしていくとか)


foo.*bar|bar.*foo
も、2語程度までが限界ですよね。
10語分繋げることを考えると気が遠くなります。
(記述も処理時間も)

言語によってはさらに処理を短縮できるような
特有な構文がありますから、調べてみればよろしいかと思います。

Qダブルクォーテーションを含む正規表現について。

正規表現によるマッチング(?)を勉強しています。

例えば「blog」という文字列で、マッチングを試みる場合は、
String str = "blog";
で、strに格納すると思うのですが、例えば「link rel=""」という文字列でマッチングを試みる場合はどうすればいいのでしょうか?
「""」の部分をそのまま文字列のダブルクォーテーションの中に入れると、エラーになってしまうので、何か別のやり方が必要だと思うのですが、わかりません…。

Aベストアンサー

もとい

”abc"abc”は”abc\"abc”と記述します

Qシェルのcase文で正規表現を使って1~99までだったらというようにしたい

#!/bin/sh
case $1 in
[1-9])echo $1;;
[1-9]*10+[1-9])echo $1;;
*)echo "エラー";;
esac

シェルの第一引数が1~99だった場合、その引数を表示するというものを作りたいのですが、
これだと二桁の数字を入力した際に*)echo "エラー";;の方へ行ってしまいます。
これではだめでしょうか?
またもしcase文でこういった事ができるのなら今は2行に渡って書いていますが、
これを1行にして書くことなどはできるのでしょうか?

Aベストアンサー

「1~99」の中に 50 なんてのは入る?
case は文字列として (厳密にはファイル名として) 比較してるよん.
だから 2つ目は
[1-9][0-9])
じゃないとダメ.
まあ, | でパターンをつないで
[1-9]|[1-9][0-9]) echo $1;;
でいいんだろうけど.

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

Qsedなどで、特定の文字列の後の文字列を抽出したい

sedなどで、特定の文字列の後の文字列を抽出したい

シェルスクリプト内で、sedなどを使って特定の文字列の後の文字列を抽出したいのですが、どうすればいいでしょうか?

たとえば、abcXYZ123defghiのなかから、XYZの後の「123」を抜き出したいです。

echo abcXYZ123defghi | sed ...

のようにして実行させたいです。

Aベストアンサー

日本語対応sedだと日本語数字混じりでもできますね。

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/' -e 'y/0123456789/0123456789/'
12357

※ 使っている日本語コードの指定は必要かも(例えば、 --ctype=EUC)

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/'
12357

※ 入力フォームに書いている時はASCIIと日本語の判別がし易いけど回答見るとわかり難いですね。後ろの例での結果57とy/0123456789/の数字部分が日本語です。

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Qjavascriptでセレクトボックスの"selected"を動的につ

javascriptでセレクトボックスの"selected"を動的につける方法について質問させてください。

現在、以下のようなフォームを作成しました。

<select name='year'>
<option value='2010'>2010</option>
<option value='2011'>2011</option>
</select>年

<select name='month'>
<option value='1'>1</option>
<option value='2'>2</option>
<option value='3'>3</option>
<option value='4'>4</option>
<option value='5'>5</option>
<option value='6'>6</option>
<option value='7'>7</option>
<option value='8'>8</option>
<option value='9'>9</option>
<option value='10'>10</option>
<option value='11'>11</option>
<option value='12'>12</option>
</select>月

<select name='day'>
<option value='1'>1</option>
<option value='2'>2</option>
<option value='3'>3</option>
<option value='4'>4</option>
<option value='5'>5</option>
<option value='6'>6</option>
<option value='7'>7</option>
<option value='8'>8</option>
<option value='9'>9</option>
<option value='10'>10</option>
<option value='11'>11</option>
<option value='12'>12</option>
<option value='13'>13</option>
<option value='14'>14</option>
<option value='15'>15</option>
<option value='16'>16</option>
<option value='17'>17</option>
<option value='18'>18</option>
<option value='19'>19</option>
<option value='20'>20</option>
<option value='21'>21</option>
<option value='22'>22</option>
<option value='23'>23</option>
<option value='24'>24</option>
<option value='25'>25</option>
<option value='26'>26</option>
<option value='27'>27</option>
<option value='28'>28</option>
<option value='29'>29</option>
<option value='30'>30</option>
<option value='31'>31</option>
</select>日


このセレクトボックスに、例えば今日の日付"2010年9月30日"だったら、それぞれの年、月、日の<option>に"selected"をつけたいのですが、javascriptではどのようにして実現したら良いのでしょうか?

よろしくお願いします。

javascriptでセレクトボックスの"selected"を動的につける方法について質問させてください。

現在、以下のようなフォームを作成しました。

<select name='year'>
<option value='2010'>2010</option>
<option value='2011'>2011</option>
</select>年

<select name='month'>
<option value='1'>1</option>
<option value='2'>2</option>
<option value='3'>3</option>
<option value='4'>4</option>
<option value='5'>5</option>
<option value='6'>6</option>
<option value='7'>7</option>
<option value='8...続きを読む

Aベストアンサー

こんな感じで・・・

<script>
window.onload=function(){
var f=document.getElementById("f0");
var ymd=new Date();
checkSelect(f.elements["year"],ymd.getFullYear());
checkSelect(f.elements["month"],ymd.getMonth() +1);
checkSelect(f.elements["day"],ymd.getDate());
}
function checkSelect(obj,val){
for(var i=0;i<obj.length;i++){
if(obj[i].value==val){
obj[i].selected=true;
break;
}
}
}
</script>
<form id="f0">
<div>
<select name='year'>
<option value='2009'>2009</option>
<option value='2010'>2010</option>
<option value='2011'>2011</option>
</select>年

<select name='month'>
<option value='8'>8</option>
<option value='9'>9</option>
<option value='10'>10</option>
</select>月

<select name='day'>
<option value='29'>29</option>
<option value='30'>30</option>
<option value='31'>31</option>
</select>日
</div>
</form>

こんな感じで・・・

<script>
window.onload=function(){
var f=document.getElementById("f0");
var ymd=new Date();
checkSelect(f.elements["year"],ymd.getFullYear());
checkSelect(f.elements["month"],ymd.getMonth() +1);
checkSelect(f.elements["day"],ymd.getDate());
}
function checkSelect(obj,val){
for(var i=0;i<obj.length;i++){
if(obj[i].value==val){
obj[i].selected=true;
break;
}
}
}
</script>
<form id="f0">
<div>
<select name='year'>
<opt...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報