お知恵をお貸しください…!どうかお詳しい方よろしくお願いいたしますm(__)m
●正規表現の使用環境
VBScript
●検索か置換か?
検索
●説明
メールアドレスをチェックしたい
1.メールは1つか、複数
2.複数メールはカンマで区切られる
3.カンマの直後にスペースが入るかも
4.メールの@以降は固定(間違って変な宛先に送らないため)
5.@より前はてきとう
つづく
つづき
●対象データ
[email protected] ←1つだけの場合
[email protected],
[email protected], ...(以下、繰り返し) ←複数の場合
●希望する結果
True または False
●↓ここまでやって力尽きました。。orz
Function blnMailCheck(strMailAddress)
Dim objRE
Set objRE = new RegExp
objRE.IgnoreCase = True
'以下のパターンが今回質問したいところです
'イメージとしては、メールが1回以上、各メール間に「,」を1つと直後にスペースを0回以上出現
objRE.pattern = "^(.*@example.com),+$"
blnMailCheck = objRE.Test(strMailAddress)
Set objRE = Nothing
End Function
ありがとうございます。いただいたパターンを試してみます。
・何をどこまでチェックしたいのか
たとえば、以下のようにメールアドレスが入力された場合は、
個々のメールの@以下がすべて、「@example.com」であれば
Trueである、としたいです。
[email protected],
[email protected] しかし、実際はメールが1つしか入力されない場合や、
カンマの直後にスペースがあったりなかったりします。
・使用できる文字の範囲
@より前はなんでもいいです。(送信に失敗するだけなので)
@以降は、「@example.com」固定にしたいです。
よろしくお願いいたします。
>>936 お前さんは何か勘違いしている
正規表現の前にvbsの使い方を覚えるぺき
938 :
932:2011/03/02(水) 18:50:51.25
>>937 パターンを「.*」のようにすればtrueが返ってくるので、
あとは適切なパターンを指定してあげるだけかと思ったのですが…
「文字列がメールアドレスかどうか判定する」
という正規表現ならググるといくつかヒットするので、
私のやりたいこともできるかも?と思った次第です。
この考え方がそもそも間違っているのでしょうか?(/ _ ; )
もしよろしければ、どこらへんを勘違いしてるかを
指摘していただけると、とてもとても助かりますm(_ _)m
939 :
934:2011/03/02(水) 18:56:16.94
>>936>>938 えーと、あなたのサンプルプログラムに
>>934で挙げた正規表現をはめ込み、
MsgBox blnMailCheck("
[email protected]")
みたいにしたら、Trueと出たけど?
VBScriptのリファレンスで、Regular Expression オブジェクトのTest メソッドを見ても、
>Test メソッドは、パターンに一致する文字列が見つかると True、見つからないと False を返します。
となってるし??
私にはこれ以上分かりませぬ。
一応…適当バージョンで@より前位置のカンマも不可ならこんな感じ。
^([^ ,@]
[email protected], *)*[^ ,@]
[email protected]$
940 :
932:2011/03/02(水) 19:33:16.76
>>939 なるほど!!
呼び出し元がおかしいってことですね。
丁寧な説明、リファレンスまで調べていただき、
大変なお手間を取らせてしまいごめんなさい。
おっしゃる通りVBScriptはまだまだ経験が浅いです(>_<)
今回のことをきっかけにして頑張っていきたいと思います。
今回は本当に勉強になりました。
どうもありがとうございました!
>>932 vbsで-1はTrueだ
覚えておくように
単に,でSplitしてFor Eachで@example.com$チェックしていけば十分だと思うけど
それにしてもVBSってLike演算子ないのか
943 :
932:2011/03/03(木) 06:04:41.74
>>941 !?(・_・;? -1はFalseだとばかり思い込んでました…
ご指摘ありがとうございます!
>>942 そんな方法もいけるんですね
もっと発想を柔らかくしないとなぁ
ご意見ありがとうございます(^-^)/
944 :
934:2011/03/03(木) 06:29:13.17
>>943 すまん、ドットに\を付け忘れてたことに気付いた。
^([^ ,@]+@example\.com, *)*[^ ,@]+@example\.com$
ついでに…
どうやって-1を目撃したのか見当つかないけど、以下は読んでおいてね。
VBScript ユーザーズ ガイド - VBScript の基本 - VBScript のデータ型
945 :
932:2011/03/03(木) 12:27:23.67
>>944 WScript.Echo blnMailCheck(strMailAddress)
↑で結果を確認してました…
素直にIf を使っていれば良かったorz
教えていただいたサイトをじっくり読んでみます!
ありがとうございました(^-^)/
16進数を2桁づつに分解する正規表現って
例えば
'5d8ce34a7dbaab'
を
['5d', '8c', 'e3', '4a', '7d', 'ba', 'ab']
というリストにしたい場合
([0-9A-Fa-f]{2}){7}
じゃだめなんでしょうか?
正規表現は文字列にマッチするかしないかだけだよ
リストに分割するとかそんな機能は持ってない
Pythonだったら
import re
re.findall(r'[0-9a-fA-F]{2}', '5d8ce34a7dbaab')
Rubyだったら
'5d8ce34a7dbaab'.scan(/[0-9a-fA-F]{2}/)
949 :
946:2011/03/04(金) 21:39:54.16
>>947-948 ありがとうございます
wxRegEx を使っています
wxRegEx re("([0-9a-fA-F]{2}){7}", wxRE_ADVANCED | wxRE_ICASE);
re.Matches(str);
とやっても
re.GetMatchCount()
の数が変なんです
wxRegEx re("([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})", wxRE_ADVANCED | wxRE_ICASE);
re.Matches(str);
なら
re.GetMatchCount() == 7
になるみたいなのですが
そんなもんなんでしょうか?
すみません
re.GetMatchCount() == 8
の間違いです
wxRegExとか知らんけど、
[0-9a-fA-F] は [0-9a-f] にして i オプション使ったほうが見やすいと思う
どこがおかしいんだ?
>>953 ありがとうございます
思い違いをしていたみたいです
ループは自分でやらないといけないんですね
>>953 これでうまくいったみたいです
ほんとうにありがとうございました
wxArrayString FindAll(const wxRegEx &re, const wxString &str)
{
wxArrayString as;
for(wxString s = str; re.Matches(s); s = s.Mid(re.GetMatch(s, 0).length()))
for(size_t i = 1; i < re.GetMatchCount(); i++)
as.Add(re.GetMatch(s, i));
return as;
}
ちなみに exe ファイルのサイズは FindAll を使う前に比べて 512 バイト増えました
速度差は調べていません
そりゃ3行程度で済む内容をいちいち関数呼んでたらサイズも大きくなるし速度も遅くなるだろうな
958 :
デフォルトの名無しさん:2011/03/05(土) 09:58:12.85
XXXとYYYの間を削除したくて、
javaで、replaceAll("XXX.*YYY", "")
このようなコードを書いてるんですが、対象が複数ある場合にうまくいきません。
AAAXXXBBBYYYCCCXXXDDDYYYEEE
AAACCCEEE ←このように変換したい
AAAEEE ←こうなってしまう
最初のXXXと最後のYYYで認識されてしまってるようなんですが、どのようにすればよいでしょうか
959 :
デフォルトの名無しさん:2011/03/05(土) 10:11:33.97
欲張り、無欲に関する質問は定期的にあるのな
強欲(possessive)というのもあるよね
おまえらにぴったりな言葉だな
まぁ過去を振り返ってもしょうがないしな
過去は振り返るものじゃない
しがみつくものだ
過去を振り返ることができるからずっと先に向かって歩いていけるのさ
ギップルさん召喚の儀式か?
過去こそが眼前にあるものであって、背後にあるものは未来である
●正規表現の使用環境
Perl
●検索か置換か?
置換
●説明
重複する文字列と区切り文字を削除したい
●対象データ
aaa;bbb;ccc;bbb;あああ;aaa;あああ;いいい
●希望する結果
aaa;bbb;ccc;あああ;いいい
よろしくお願いします
区切りごとに分割して、ソートで重複を除く
uniqもねーのかこの言語
my $a = 'aaa;bbb;ccc;bbb;あああ;aaa;あああ;いいい';
my %a;
$a =~s/([^;]+);?/$a{$1}++==0?$&:''/ego;
正規表現にこだわらなければ、
>>969-970の合わせ技も
my $s = "aaa;bbb;ccc;bbb;あああ;aaa;あああ;いいい";
my %seen;
$s = join ";", grep { !$seen{$_}++ } split /;/, $s;
●正規表現の使用環境
linux コマンドラインの grep
●検索か置換か?
検索
●説明
末尾が一致していて途中が違う文字列のうち、特定のパターンを除去した集合を取得したい
●対象データ
aaabbbcccあああいいい
aaabbbcccううういいい
aaabbbcccえええいいい
●希望する結果
aaabbbcccううういいい
aaabbbcccえええいいい
「説明」がうまく書けないのですが。
よろしくお願いします
grep 'いいい$' | grep -v 'あああ'
976 :
974:2011/03/15(火) 15:38:21.24
なるほど。
助かりました。ありがとう。
977 :
デフォルトの名無しさん:2011/03/15(火) 17:34:57.18
>>968 これと同じ事をBREGEXP DLLを使った正規表現置換でやりたいのですが可能でしょうか?
tes
ファイルから読んだ文字列の中に正規表現があるとして
それを展開して処理することはできますか?
$moji = "123";
$hoge = "12\d";
if($moji =~ /$hoge/){
print "一致";
正規表現の文字列があった場合にTRUEなのね。
危険だと思う。