正規表現 Part6
..
682:デフォルトの名無しさん
09/12/25 19:56:08
●正規表現の使用環境
perl5.8.7 CentOS 5.3
文字コードはEUCです。
●検索か置換か?
置換
●説明
全銀テレ為替文字対応のため、数字、大文字英字、半角カナ・濁点、一部半角記号記号のみの文字列に
変換したいのです。
可能文字はこちら
URLリンク(www.kyodocms.jp)
これら以外の文字を半角スペースに置き換えたいのです。
●対象データ
任意の文字列です。
1.ひらがな→カタカナ変換
2.全角→半角変換
3.英小文字→英大文字変換
4.ァィゥェォッャュョをアイウエオツヤユヨに変換
ここまで出来てて、入力可能文字以外をスペースに置き換えたいんですが、上手くいきません。
どうすればいいでしょうか?
683:デフォルトの名無しさん
09/12/25 20:29:25
[^0-9A-Zアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン゛°\\,\.「」\(\)\-\/]
を
に置換
あってるかどうかは試してないけどこういうこと?
684:デフォルトの名無しさん
09/12/25 22:49:43
>>683
レスどうもです。そのとおりです。
>>682の条件を変数$regExpに代入し、
$result = 'パ-カ-ヲ買ツタ01234567';
$result =~ s/$regExp/ /g;
とすると、漢字だった部分が文字化けし、「パ-カ-ヲ ・糟・1234567」となってしまいます。
結果は「パ-カ-ヲ ツタ1234567」にしたいのです。
685:デフォルトの名無しさん
09/12/26 00:05:51
未定義領域含んでるんじゃね?
文字の正規表現
URLリンク(www.din.or.jp)
686:デフォルトの名無しさん
09/12/26 00:26:46
質問があります。
<div id=・・・>←1
<div id=・・・>
</div>←2
<div id=・・・>
</div>←3
</div>←4
抜き出したいのは1から4全体なんですけど
"<div id=・・・(.+?)</div>
で非欲張り系で抜き出すと1から2までヒットします。
1から4全体を抜き出す方法ていうのはないのでしょうか?
XML形式ならいけるぽいのですが・・・
無理なのでしょうか?
687:デフォルトの名無しさん
09/12/26 01:52:00
対応するタグという意味なら田中スペシャルが使えればできる。
688:デフォルトの名無しさん
09/12/26 08:16:39
ていうか素直にXMLパーサ使え
689:デフォルトの名無しさん
09/12/26 12:19:49
HTMLの処理には正規表現ではなくHTMLパーザを、XMLの処理にはXMLパーザを。
テンプレに入れてもいいレベルのFAQ。
690:デフォルトの名無しさん
09/12/27 02:55:21
わかりました。パーサを調べてみます
691:デフォルトの名無しさん
09/12/28 18:29:47
文字列を分割するとき、特定の文字で囲われているものは除外するっていう方法ありますか?
phpなんですけど
preg_splitで例えば
A,B,C,'D,E',F
を
[0]=A
[1]=B
[2]=C
[3]=D,E
[4]=F
上記のように分割できますか?
692:デフォルトの名無しさん
09/12/28 18:34:35
普通にCSVのモジュール使えばいいのでは
693:デフォルトの名無しさん
09/12/28 19:36:26
>>691
詳説 正規表現 にCSV処理のサンプルあるよ。オヌヌメ
694:デフォルトの名無しさん
09/12/30 15:29:52
●正規表現の使用環境
Java1.5(Firefox 3.0.16)
●検索か置換か?
検索
●説明
\.nas(3|5)\d+\.[a-z\-]+\.nttpc.ne.jpという文字列を検索したいです。
※検索対象の文字列自体が正規表現のようになっています。
●対象データ
\.nas(3|5)\d+\.[a-z\-]+\.nttpc.ne.jp
●希望する結果
\.nas(3|5)\d+\.[a-z\-]+\.nttpc.ne.jp
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
※完全一致
自分なりに\を付けたりして試してみたのですが出来ませんでした。
以上、どうかよろしくお願いします。
695:デフォルトの名無しさん
09/12/30 17:02:17
文字列定数内の \ 自体を \\ とするエスケープまで含めて
"\\\\\\.nas\\(3\\|5\\)\\\\d\\+\\\\\\.\\[a\\-z\\\\\\-\\]\\+\\\\\\.nttpc\\.ne\\.jp"
となる
696:デフォルトの名無しさん
09/12/31 10:01:19
>>695
694です。
どうもありがとうございました。
すごく長い表現になっちゃうんですね。(汗
697:デフォルトの名無しさん
09/12/31 15:49:42
こんにちは。
度々すみませんが、よろしくお願いします。
●正規表現の使用環境
Java1.5(Firefox 3.0.16)
●検索か置換か?
検索
●説明
#ipbf\d+souka.saitama.ocn.ne.jp という文字列を検索したいです。
//マッチする
var body = document.body.innerHTML;
var temp1;
temp1 = new RegExp(/#ipbf\\d\+souka.saitama.ocn.ne.jp/);
alert(temp1.test(body));
//マッチしない
var body = document.body.innerHTML;
var word = new Array();
var temp2;
word.push('#ipbf\\d\+souka.saitama.ocn.ne.jp');
for (var i = 0; i < (word.length); i++)
{
temp2 = new RegExp(word[i]);
alert(temp2.test(body));
}
●対象データ
#ipbf\d+souka.saitama.ocn.ne.jp
●希望する結果(※完全一致)
#ipbf\d+souka.saitama.ocn.ne.jp
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
「//マッチしない」方の配列内容を変えずに(\を追加せずに)一致させたいです。
以上どうか、よろしくお願いします。
698:デフォルトの名無しさん
09/12/31 16:25:29
Pattern.quote 使えばできるんでない?
699:デフォルトの名無しさん
09/12/31 22:01:43
>>697
word.push(/#ipbf\\d\+souka.saitama.ocn.ne.jp/);
700:デフォルトの名無しさん
09/12/31 22:38:39
>Java1.5(Firefox 3.0.16)
JavaじゃなくてJavaScriptでしょ?それなら>>695は正規表現リテラルでこう書ける
/\\\.nas\(3\|5\)\\d\+\\\.\[a\-z\\\-\]\+\\\.nttpc\.ne\.jp/
701:デフォルトの名無しさん
10/01/02 16:48:00
>>698
>>699
>>700
返事が遅くなりすみません。
レスありがとうございます。
体調が悪くまだよく試していないのですが、まずはお礼だけで失礼します。
702:デフォルトの名無しさん
10/01/03 22:07:34
JavaとJavaScriptが区別できない人っていまだにいるのか…
703:デフォルトの名無しさん
10/01/03 23:16:48
VBとVBAの違いもな。
説明するの大変なんだよな・・・。
704:デフォルトの名無しさん
10/01/03 23:32:15
VBとVBAの違いなんて知らない奴たくさんいるだろ
VB触ってるのは底辺だけなんだから
705:デフォルトの名無しさん
10/01/03 23:55:38
ゲーム機は全て「ファミコン」だ。
706:デフォルトの名無しさん
10/01/04 01:36:20
ファミコンって何だ?
ピコピコのことか?
707:デフォルトの名無しさん
10/01/04 13:05:34
ピコピコはゲームウォッチ系じゃねーの?
知人が20万円ほど出してPC-98を買ったら
姉に「たっかいファミコンやなぁ」と言われたらしい。
708:デフォルトの名無しさん
10/01/05 12:45:41
●正規表現の使用環境
Java1.5
●検索か置換か?
検索
●説明
123456700 とか12345678-00など
7桁から10桁の数字にあと2桁の数字がハイフンもしくは連続して付属する数列の検索。
数列の直前にCodeまたはInvoiceがついてたら除外する。
Invoice 12345678-00 はマッチしないけどaccess# 12345678-00 はマッチする。
"On Invoice 123446789, your order was placed. However, please be sure to note that your account number 789456123 is suspended until further notice."
最初の番号Invoice 123446789は無視するけどaccount number 789456123はマッチするようにしたい。
●対象データ
Invoice 123446789
word 454545454
454545454545
Code: 4085432259
passcode 6789012 06
number 8901234 08
word 454545454 word
●希望する結果
マッチしない
Invoice 123446789
Code: 4085432259
passcode 6789012 06
Code 7890123-07
^(?!(Code|Invoice).)([^=\/%(.]\b\d{7,10}((\d?\d?)|(-\d\d))?\b)
自分でここまでやったけどうまく動かないです。
よろしくお願いいたします。
709:デフォルトの名無しさん
10/01/05 13:09:16
javaならプログラム書けるんだからInvoice,Codeのことはとりあえず
忘れてマッチさせて、そのあとでマッチ位置からさかのぼってCode,
Invoiceがないことを確認する方がたぶん楽だと思うよ。
710:デフォルトの名無しさん
10/01/05 13:09:29
javaならプログラム書けるんだからInvoice,Codeのことはとりあえず
忘れてマッチさせて、そのあとでマッチ位置からさかのぼってCode,
Invoiceがないことを確認する方がたぶん楽だと思うよ。
711:デフォルトの名無しさん
10/01/05 13:10:13
すまん2つ出た
712:デフォルトの名無しさん
10/01/05 14:16:10
ありがとうございます。実際にはJAVAで作成しているわけではなく、アプリケーションがJAVAとおなじ正規表現を使用している環境なので、プログラムを書くことはできないんです。それでここでアドバイスがいただければと思いまして、
713:デフォルトの名無しさん
10/01/05 14:30:07
look-ahead(?!...)じゃなくてlook-behind(?<!...)を使うとこだね。
そしてlook-behindはたいていある決まった長さのの文字列に
マッチするパターンがしか使えないので、
(?<!Invoice: )(?<!Invoice )(?<!Code: )(?<!Code )
のように並べて使うことになるだろう。
必要な仕様がきちんと書かれてないのでこれだというのは
示せないけどがんばれ。
714:デフォルトの名無しさん
10/01/05 14:51:49
●正規表現の使用環境
VB.NET
●検索か置換か?
検索
●説明
タブを含む何かの文字列の複数行を表す方法を教えて
●対象データ
AAAA
TAB TAB hogehoge改行
あああああ
TABT ABT AB hogehoge改行
TAB TAB hogehoge改行
ZZZZ
●希望する結果
あああああ
Regex("AAAA\n([\t.]+?\n)+(?<1>.+?\n)([\t.]+?\n)+ZZZZ",MultiLine)
上のように書いてみましたがだめでした。
AAAA改行とZZZZの間の文字列をターゲットにしつつ
その中にタブか何かの文字の組み合わせの文字列が1つ以上あって、行末に改行がある
という行がいくつかある。
ということを書いたつもりなのですが間違っているところを教えて頂きたいです。
715:デフォルトの名無しさん
10/01/05 15:06:04
[\t.]だとタブまたは任意の文字なので結局[\t.]+?は.+?と書いたのと同じ。
また、〜+?とは普通書かないね。〜*と同じなので。
\tが少なくとも一つ含まれた行にマッチさせたいなら、
.*\t.*\n
716:デフォルトの名無しさん
10/01/05 15:09:31
いや+?は最短マッチだろ。
717:デフォルトの名無しさん
10/01/05 15:12:27
Multilineなら\nは.に含まれないので、.+?\nと書いても結局.*\nと
同じになるっていいたいんじゃねーの?
718:デフォルトの名無しさん
10/01/05 15:48:20
それをいうなら.+じゃないか
719:デフォルトの名無しさん
10/01/05 16:31:59
前にも .+? と .* が等価だと思ってる人がいたような。
\d? とかの ? と同じものに見えてるのかな。
720:デフォルトの名無しさん
10/01/05 22:00:58
>>715
[\t.] ってブラケットの中にはいってんのなら'.'は単なるピリオドでしょ。
721:デフォルトの名無しさん
10/01/10 22:09:28
Javascriptを勉強中です。といっても、ブックマークレット程度しかやってませんが。
正規表現を練っていたときに、もうかなり以前のブラウザから最短一致(ものぐさ/non-greedy/非貪欲)が
使えるようになっていたことを知り、いま必要というわけではないのですが、詳しく調べてました。
{n,m}? {n,}? *? +? ?? ←これらについては自習して使い方を理解したのですが、{n}? が解りません。
どう考えても {n} と {n}? は同じ結果になるように思えるのです。
正規表現のリファレンスや正規表現を解説しているサイトは数多く見ましたが、量指定子の直後に?を付けた
{n}? を紹介はしていても、その使い方を例示したものを見つけることが出来ませんでした。
どなたか解説していただければ幸いです。よろしくお願いします。
記号関係はGoogleでも検索しづらいので、なかなか見つかりません。Googleの弱点ですね。
722:デフォルトの名無しさん
10/01/10 22:36:48
googleに頼り切ってるヤツの弱点に見えるけどなぁ
URLリンク(www.kt.rim.or.jp)
>a{n}? = ちょうどn回の繰り返しにマッチします。ちょうどn回なので、a{n}と等価であり、一貫性のためだけに存在します。
要するに/x{1}/の意味を問うているようなもん
723:デフォルトの名無しさん
10/01/11 12:53:43
>>722
的確な回答ありがとうございます。
>googleに頼り切ってるヤツの弱点に見えるけどなぁ
検索ばかりしてるんじゃなく良書を得てそれで勉強せよ、またはGoogleに頼り切ってると
目が節穴になるぞ、というお叱りと理解いたしました。
☆perlretut - Perl の正規表現のチュートリアル
URLリンク(www.kt.rim.or.jp)
これは>>2の一番最初、「正規表現メモ」のページにある一番最初のリンクですね。
答えへの近道はGoogleでなく、このスレにあったようで…目が節穴でした。
このチュートリアルはとても解説が丁寧で、まさしく良書だと思います。これで勉強します。
結論としては /x{n}/ と /x{n}?/ は同じ結果なので、通常 {n}? は使用されない、ですね。
やはりPerlだと細かい情報もしっかりあってスゴイです。
これからは正規表現で悩んだらこのスレとPerlの周辺を当たってみようと思います。
724:デフォルトの名無しさん
10/01/11 15:57:50
>>723
それ、Perlのマニュアルなんだよ。UNIX系のシステムだったら
man perlretut を実行すると表示されるよ。
ウェブを見るより先にマニュアルを読めってことで。
725:デフォルトの名無しさん
10/01/11 16:31:29
.NET のマニュアルにも {n}? は {n} と等価って書いてあるな。
なんか訳が微妙におかしいけど。
URLリンク(msdn.microsoft.com)(VS.80).aspx
726:723
10/01/12 22:05:22
>>724
UNIX系とは縁がありませんが、perlre/perlretutはWeb上にあるので、それをmanの代わりにします。
Javascriptで使える表現かどうかは、以下を見てチェック。
☆RegExp - Core JavaScript 1.5 Reference - Mozilla Developer Center
URLリンク(developer.mozilla.org)
出来るだけ大本の公式情報を参照すべし、ですね。
>>725
情報ありがとうございます。間違ってはいませんが、確かに変ですねぇ。
perlretut、面白いですね−。塩基配列のストップコドンのとことか。
自習してみて、チュートリアルと同じ結果になるのを確認したのはいいのですが…
Javascript:var R=/(\w\w\w)*?TGA/g, S='ATCGTTGAATGCAAATGACATGAC', A = [], I = 0; while(R.test(S)) {A[I] = RegExp.lastMatch + ' (' + RegExp.lastParen + ') Pos=' + R.lastIndex; ++I;} alert(A.join('\n\n'));
なぜずれるのか、理解できず…。その後バックトラックの動作を知り、単に「必ず3文字ずつ進む」と
思い込んでただけだと気付きました。。。マッチにトライして失敗したらそこで終わりではなく、
開始位置を1文字進めるんですね。筆者が仕掛けた罠に見事にハマりました。。。
というか、こういう処理は素直に3文字ずつ取り出して判定すべきですよね。
なお、Javascriptには\Gなんてありませんでした。残念!
727:デフォルトの名無しさん
10/01/13 21:03:05
>726
man じゃなくても perldoc perlretut でいけるよ。
728:デフォルトの名無しさん
10/01/15 16:56:04
>>725
MSDNライブラリは機械翻訳だからしかたないべ
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5400日前に更新/175 KB
担当:undef