正規表現 Part5at TECH
正規表現 Part5 - 暇つぶし2ch498:デフォルトの名無しさん
08/12/06 21:09:48
ふらっとC#,C♯,C#(初心者用) Part34
スレリンク(tech板:607番)
から来ました

C#でRegexを使って正規表現を利用しています

if (Regex.Match(" Xxxxxxxxx.xxxxxxxxxxxxxx.xxxx", @"\s+((\w+\.?)+)$").Success)
{
Console.WriteLine("True!");
}
else
{
Console.WriteLine("False!");
}
Console.WriteLine("カンマあり");
if (Regex.Match(" Xxxxxxxxx.xxxxxxxxxxxxxx.xxxx,", @"\s+((\w+\.?)+)$").Success)
{
Console.WriteLine("True!");
}
else
{
Console.WriteLine("False!");
}


マッチする場合は後で ((\w+\.?)+)$ の部分について処理をして、マッチしない場合はそのまま次にいくようにしたいのですが
このパターン文字列だと上記のような文字列でカンマが末尾にある場合はfalseが返ってくるまで異常に時間がかかってしまいます
最終的に ((\w+\.?)+)$ 出マッチする場合とと同じ文字列が得られる、末尾にカンマが合っても処理が遅くならないパターンがあれば教えてください


499:デフォルトの名無しさん
08/12/06 22:50:00
>>498
(\w+)+ みたいな感じになるから遅いんだろうねえ。

\s+\w+(\.\w+)*$

でどうか。


500:デフォルトの名無しさん
08/12/06 22:50:51
キャプチャするから
\s+(\w+(\.\w+)*)$
こうか。



501:498
08/12/06 23:56:46
>>499,500
ありがとうございます、見違えるように早くなりました
(\w+)*は良くても(\w+)+は遅くなるんですね

502:デフォルトの名無しさん
08/12/07 03:52:21
>>501
> (\w+)*は良くても(\w+)+は遅くなるんですね

んー、そういうことではないぞ。
\.? は有っても無くてもいいけど、(\.\w+)* の \. は必要でしょ。
(\.?\w+)* にしたらやっぱり遅くなるはず。

(\w+\.?)+ は「.xxxxxx」だけにも何通りもマッチの仕方があるけど、
(\.\w+)*は1通りしかマッチできない。この違いだよ。


503:498
08/12/07 10:07:49
>>502
? と +(もしくは*) の組み合わせが最悪だったわけですか
今度から注意します

504:デフォルトの名無しさん
08/12/07 13:53:02
>>503
なんかまだ誤解してるっぽいな。
*)*
みたいに、カッコの内側の最後に繰り返し指定(*やら+やら)があって、
その外側すぐにも繰り返しがあるのが問題(になることが多い)。
498が最初に書いたようなマッチしないデータを食わせたときに、
バックトラック回数がとんでもなくでかくなって遅くなる(可能性がある)。


505:498
08/12/07 15:05:16
>>504
理解が遅くてすみません、ようやく分かりました
丁寧にありがとうございました

506:デフォルトの名無しさん
08/12/07 20:39:26
正規表現が手に入れた強力すぎる「構文理解(マッチ)能力」って、
外国語の翻訳に使えそうな気がするんだけど、その観点での研究って進んでないの?

507:デフォルトの名無しさん
08/12/07 21:38:53
そりゃ無理でしょ。
yaccやbisonで実用になる翻訳ソフトが作れるって話は聞かないから。

508:デフォルトの名無しさん
08/12/07 21:53:34
>>506
正則言語はそんなに広いクラスじゃないぞ

509:デフォルトの名無しさん
08/12/07 21:56:51
>>506
一般の自然言語と正規言語では言語のクラスとして天と地ほどの差があるよ。
たとえば、多くの自然言語は無限回のネストを許容するが、これは正規文法で表せない。

510:デフォルトの名無しさん
08/12/08 08:03:55
お前らちゃんと日本語話せよ何言ってるか分かんねぇよ

511:デフォルトの名無しさん
08/12/08 11:28:01
お前が勉強不足なだけだ。

512:デフォルトの名無しさん
08/12/08 11:45:24
なんて面白みの無い、むしろマイナスなレスなんだ

513:デフォルトの名無しさん
08/12/09 18:38:31
●正規表現の使用環境
PHP4.4以降

●検索か置換か?
検索後、個々に置換

●説明
ユーザーが入力したhtmlデータ内に
特定の文字で囲まれたものを変換したい。
%test%や%nullpo%など。

●対象データ
フォームで送信されたhtmlデータ
<html>
<head>
</head>
<body>
%adv%
あいうえおかきくけこ<br>
%adv%
</bnody>
</html>

●希望する結果
%adv%を発見した位置を返し、それを指定された文字列で置換する。
%adv%は全て同じではなく、別の文字をそれぞれ割り当てたい。

よろしくお願いします。

514:デフォルトの名無しさん
08/12/09 19:41:55
>>513
>%adv%は全て同じではなく、別の文字をそれぞれ割り当てたい。
この時点で、正規表現でやるのには無理がある。
状態を持つには何らかのプログラミング言語で。
HTMLならJavaScriptか。

515:デフォルトの名無しさん
08/12/09 21:03:49
PHP使ってるからテンプレートエンジン使ったらどうだろうか

516:デフォルトの名無しさん
08/12/12 02:35:21
よくわかんないけど、%date%→2008/12/12 %name%→田中みたいにして

%name%様への%date%のお知らせです。

田中様への2008/12/12のお知らせです。みたいになるようにしたいんじゃないの?
正規表現っていうか普通に置換すればいいだけじゃないの?%name%→%date%とかなると置換順序によってはおかしくなるから、
そこは%name%を%date%で置換したいなら%%date%%と入力しといて後で%%を%に(ryみたいにすればいいと思うけど。
>>514は何が言いたいのか良くわからない。
>>515に同意。Smartyとか使えば全部やってくれるから楽だけど…

517:デフォルトの名無しさん
08/12/12 09:24:04
>>516
>%adv%は全て同じではなく、別の文字をそれぞれ割り当てたい。
この文章を素直に解釈すると、同じ「%adv%」でも状況に応じて
「こんにちは」にも「さようなら」にもなるって事じゃないのかな。
で、そういう状況依存的な内部状態を持つ操作は、
変数や条件判断文のあるプログラミング言語でないと不可能。
何か変?

518:506
08/12/13 22:59:58
>>507-509
正規表現の(現時点での)限界があることはわかりました。
が、自然言語の「(ある種の)典型的な表現」を滑らかに翻訳するという狭いクラスのタスクに対しては
正規表現がその強力な威力を発揮できると今でも思っています。

519:デフォルトの名無しさん
08/12/14 00:02:11
限界とか威力とか意味わかんね。
正規表現なんて正規文法を別の記号で書き直しただけじゃん。
数学的に厳密な定義のあるものなんだから、
明日になって威力が変わったりしないよ。

520:デフォルトの名無しさん
08/12/14 02:58:28
正規表現を、どんな夢でもかなえてくれる魔法の呪文とでも勘違いしてないか?

521:デフォルトの名無しさん
08/12/14 08:53:37
文法の表現力では
正規文法 < 文脈自由文法 < 文脈依存文法 < 解析表現文法

522:デフォルトの名無しさん
08/12/15 00:24:39
ABCを含まない行にマッチさせたい場合

^(?!.*ABC)  ←OK
(?!.*ABC)  ←NG

となるのでしょうか?
上記の違いが分かりません


523:デフォルトの名無しさん
08/12/15 00:38:48
>>522
.*がABCを食うから。

524:デフォルトの名無しさん
08/12/15 00:49:37
^があるとなぜ食えないんですか?

525:デフォルトの名無しさん
08/12/15 01:52:03
/^(?!.*ABC)/の場合、まず/^/が文字列の頭にマッチする。
そこから後ろ(即ち元の文字列全体)が、/^(.*ABC)/にマッチしなければ、全体としてマッチする。

/(?!.*ABC)/の場合は、どんな文字列であっても末尾にマッチする。
なぜなら文字列の末尾から後ろ(即ち空文字列)は/^(.*ABC)/にマッチしないから。

526:デフォルトの名無しさん
08/12/15 15:17:08
>>517
あーなるほどね。1回目の%adv%では「こんにちは」、2回目の%adv%では「さようなら」にしたい、とかか。
そりゃ正規表現じゃ無理だわ。いや、限定的な状況ならいけるかもしれないけど。

527:デフォルトの名無しさん
08/12/16 12:11:49
含まない行、のような指定は、できるなら -v オプションとか
正規表現より上のレイヤでやったほうがよい。

528:デフォルトの名無しさん
08/12/16 12:32:43
それはスレ違い

529:デフォルトの名無しさん
08/12/16 19:58:47
いいんじゃない?
正規表現だけでは何もできないんだから。
perl とか、テキストエディタとか、そのた言語と組み合わせないと。

530:デフォルトの名無しさん
08/12/16 22:12:40
perlとかテキストエディタとかその他の言語のサポートまではしてられないってことだろ。よう知らんけど。

531:デフォルトの名無しさん
08/12/17 01:43:09
>>527はどこまで正規表現を使うべきかという立派な正規表現ネタに見えた。
正規表現で実現可能なことは無理してでも正規表現を使え
なんていう愚かなスレでもないだろうw

532:デフォルトの名無しさん
08/12/17 09:10:18
実用的な解と、パズル的な解か。

533:デフォルトの名無しさん
08/12/22 14:32:23
例えば、 ABC と DEF という文字列があったとき、

ABCの場合
ABC (123)

DEFの場合
DEF (345)

という形に置き換えるのは可能でしょうか?
また、可能ならどのように書いたらいいでしょうか

534:デフォルトの名無しさん
08/12/22 14:53:58
>>533
できる。正規表現は
/ABC/
/DEF/

意地悪はさておき、ABCやDEFを検出するのは正規表現だけど
置換をするのはそれぞれの「実装言語や処理系ソフトウェア」だから
>>5のテンプレ埋めてくれないと答えられない。

535:533
08/12/22 15:54:12
すみません
訂正します

●正規表現の使用環境
Jane Style Version 3.01

●検索か置換か?
検索後に置換

●説明
文字列にマッチさせた後、マッチした文字列ごとに指定された文字列を後ろに
追加させて置換させたい

●対象データ
① ABC
② DEF

●希望する結果
① ABC (123)
② DEF (345)

536:デフォルトの名無しさん
08/12/22 16:25:00
普通の置換でよくね?

537:デフォルトの名無しさん
08/12/22 16:51:55
すみません、説明が足りませんでした

この二件だけの場合は二つ表現を書けばいいですが、
後ですぐに置換したい文字列を追加できるよう、(ABC|DEF)のように
orか何かでまとめて作りたいと思っています

それは可能でしょうか
それともやはり一つ一つ書いたほうがいいでしょうか

538:デフォルトの名無しさん
08/12/22 17:24:29
>>537
まとめようにも法則性が無いが。

539:デフォルトの名無しさん
08/12/22 17:27:44
てか、Jane Style って専ブラだよね?
どういう機能で何をしようとしてるのかがわからないとどうにもアドバイスのしようが...
(このスレは基本的には、grepやawkやPerlやPythonやJavaの正規表現のスレなので)

540:デフォルトの名無しさん
08/12/22 17:41:12
<rx2>(?<=ABC)[TAB] (123)[TAB]msg
<rx2>(?<=DEF)[TAB] (345)[TAB]msg



541:デフォルトの名無しさん
08/12/22 20:35:21
これですね。ちゃんと書いてあります。
URLリンク(www.monazilla.org)

542:デフォルトの名無しさん
08/12/22 21:36:27
>>538
あまり正規表現について詳しくないもので
やはりちょっと無理がありましたね・・・

>>539
すみません
少し勘違いをしていました

>>540
有難うございます!
すごくスッキリしていていいですね
参考にさせて頂きます

543:デフォルトの名無しさん
08/12/27 19:09:30
perl で

abc-def-1234-ghi-jkl
これから
abc-def
を取りたい

1234は数字が4文字です
1234の前を取るのはどうすればいいですか?


544:デフォルトの名無しさん
08/12/27 19:14:41
「取る」とは?

「抽出したい」 → 結果として abc-def が欲しい
「削除したい」 → 結果として -1234-ghi-jkl が欲しい
どっち?

できれば >>5 を参考に。

545:デフォルトの名無しさん
08/12/27 19:31:16
もっと高級言語っぽい表記で書けるといいのになぁ。

546:デフォルトの名無しさん
08/12/27 19:31:35
(ちょっと変えました)
prelで

●検索か置換か?
検索

●説明
12-34は数字が2文字ハイフン2文字です
(\d{2}-\d{2} こうかな?)

12-34の前を抽出するにはどうすればいいですか?
12-34の前の部分に数字が2文字は無いです。

●対象データ
abc3-d5ef-12-34-ghi-jkl
ho-1ge=+-e67-89+fuga++--jkl


●希望する結果
abc3-d5ef-
ho-1ge=+-e


547:デフォルトの名無しさん
08/12/27 20:59:42
>>546

12-34でもその一般化したパターンでも使ってマッチングさせてから
特殊変数 $` や@- を参照するなり他の手段で抜き出すなりすればよろしかろ?


548:デフォルトの名無しさん
08/12/27 23:26:09
>>546
カッコ ( ) をつかえばいいよ。

549:デフォルトの名無しさん
08/12/28 11:20:42
>>546
print /(.*)(?=\d{2}-\d{2})/ ? "match:[$1]\n" : "unmatch.\n" for qw(
abc3-d5ef-12-34-ghi-jkl
ho-1ge=+-e67-89+fuga++--jkl
);

550:デフォルトの名無しさん
09/01/01 12:55:59
単純にたくさんのテキストファイルから目当てのキーワードのある行を
正規表現で検索したい場合、Windows環境だとどのツールが便利・一般的なの?
秀丸かな?
Unixだとgrepコマンドがあるけど…

551:デフォルトの名無しさん
09/01/01 13:29:08
>>550
一般がどうかはしらないけど自分は秀丸やxyzzyの機能を使ってる

552:デフォルトの名無しさん
09/01/01 13:32:37
grepでいいよ

553:デフォルトの名無しさん
09/01/01 13:44:45
XP以降だと標準でfindstrコマンドがあるね
Cygwinを入れるのもいいし、各種テキストエディタに頼るのもいい

でも一番の検索ツールは、



| 何について調べますか?
| ┌──────┐
| |                   |
| |                    |
| └──────┘
| [ オプション(O) ]   [ 検索(S) ]
|
`─────┐ ┌──
           , '´l,  ..| ./
       , -─-'- 、i_  |/
    __, '´       ヽ、
   ',ー-- ●       ヽ、
    `"'ゝ、_          ',
      〈`'ー;==ヽ、〈ー- 、 !
       `ー´    ヽi`ヽ iノ
                ! /
              r'´、ヽ
              `´ヽノ

554:デフォルトの名無しさん
09/01/01 13:51:57
| 何について調べますか?
| ┌──────┐
| | おまいの消し方        |
| |                    |
| └──────┘
| [ オプション(O) ]   [ 検索(S) ]
|
`─────┐ ┌──
           , '´l,  ..| ./
       , -─-'- 、i_  |/
    __, '´       ヽ、
   ',ー-- ●       ヽ、
    `"'ゝ、_          ',
      〈`'ー;==ヽ、〈ー- 、 !
       `ー´    ヽi`ヽ iノ
                ! /
              r'´、ヽ
              `´ヽノ

555:550
09/01/01 14:13:35
さんくす、やっぱりそのへんかぁ。

556:551
09/01/01 14:17:19
このスレのせいで550がイルカの虜になってしまった
なんて親切なスレなんだ

557:553
09/01/01 14:17:59
名前間違えた、>>556は553

558:デフォルトの名無しさん
09/01/02 11:43:20
2007ではイルカ出なくなってるよね

559:デフォルトの名無しさん
09/01/02 11:46:47
冴子先生がいい

560:デフォルトの名無しさん
09/01/02 16:37:56
スターウォーズのジャージャービンクス
Office のイルカ

大ヒットメーカーが調子に乗りすぎて生み出してしまった
世界の2大うざキャラ。

561:デフォルトの名無しさん
09/01/02 17:31:36
なんかわかるw

562:デフォルトの名無しさん
09/01/08 11:11:00
perlで下のような場合にマッチさせたいのですが、どのようにすればいいのでしょうか?

<[a-z]+ lang="ja">.*?</[a-z]+>

最初の[a-z]+と最後の[a-z]+は同じタグを指定したいのですが、
このままだと、</a>や</b>といった終了タグが先に引っかかってしまい、
いびつな形でマッチしてしまいます。

563:デフォルトの名無しさん
09/01/08 17:22:05
>>562
正規表現一発じゃキツい
スキャナを書くか、素直にHTMLパーザ使った方が

564:デフォルトの名無しさん
09/01/08 17:36:17
>>562
バックリファレンスかな
<([a-z]+) lang="ja">.*?</\1>
こんな感じで

565:デフォルトの名無しさん
09/01/08 17:36:39
単純にそういう条件だと\1使えばいいんじゃ? いろいろやるつもりなら
結局パーサ使った方が楽ってことになりそうだけどね。

$s = q{<hoge lang="ja"><a>hogehoge</a><b>hoge</b></hoge>};
print $& if $s =~ m{<([a-z]+) lang="ja">.*?</\1>};

566:デフォルトの名無しさん
09/01/08 17:54:09
>>564-565
> <([a-z]+) lang="ja">.*?</\1>
でうまくいきました。

残念ながら、XMLパーサの使い方がわからない。勉強しないとなぁ…

目的は和英中が混在しているxmlから日本語の部分だけ抽出したかったので、
今回はこれで十分です。

XMLとHTMLタグが混在した形式だったんですが、何故か、HTMLタグにlang設定が
されていて途方にくれていました。

567:デフォルトの名無しさん
09/01/08 18:39:02
たとえば <xxx lang="ja"><xxx>foobar</xxx></xxx> というときにちゃんと取り出せないねえ

本当にちゃんとやろうとしたら正規表現だと無理だな

568:デフォルトの名無しさん
09/01/10 12:59:56
XMLは文脈自由文法だからPCREの拡張とか使わないと無理

569:デフォルトの名無しさん
09/01/14 15:34:24
Perlなら再帰的なやつもイケる
ちゃんとチェックしとらんが

local our@A;
my$a="jjj<unko>an<unko>hoge</unko>gf</unko>";
local our$b=qr{(.*?(<unko>(??{$b})</unko>)(?{push@A,$2}))*.*?};

$a=~$b;

print join($/,@A),$/;


570:デフォルトの名無しさん
09/01/20 13:53:47
正規表現のライブラリを自作してるのですが参考になるサイトはないでしょうか。
容易な拡張性を確保するためにオブジェクト指向を使って実装してます。

例えば
inputstr[k] == pattern[k] ?

ではなくて
pattern.can_eat(inputstr[k])

のようなpatternをレシーバ(インスタンス)としたかんじです。
現在はグループの中にグループがあるとどうやって解決するか悩んでいます。
(ab(cd|ef)gh)

などで、一応JAVAで実験してます。

571:デフォルトの名無しさん
09/01/20 13:59:04
pattern.can_eat(inputstr[k]) ?
pattern.contains(inputstr[k]) ?

などでboolean関数です。
性能は速いかどうかではなく、コンパクト・コードサイズ小さいなど目指しています(機能拡張はオブジェクト指向と同じくプラグインしますんで)。
構文木を作るとかではなく容易にスクラッチから書ける程度のコードサイズで、かつ動的に実行時に機能追加できると言うのが条件で作っています。

572:デフォルトの名無しさん
09/01/20 14:04:39
他の言語の正規表現APIは参考にしてる?
OOならJava, Ruby, Python, .NETとあると思うけど

573:デフォルトの名無しさん
09/01/21 01:14:50
あれ?反応ないですね。
オブジェクト指向を使った実装だと構文木を使ったものよりもだいぶ簡単になる(見通しがよくなる)んですけど・・・
多少コード量(というかクラス・ファイル数)は多くなるんですけど、やっぱりインタプリタは旧来式の構文木を使った実装しかやらないんでしょうか。

574:デフォルトの名無しさん
09/01/21 01:28:45
何をしたいのかが伝わってないんだろう。
読んで、正規表現ライブラリを利用者に見せるためのAPIの話ではないの
かも、という印象は持ったが、それ以上は考えるが面倒くさいのでス
ルー。


575:デフォルトの名無しさん
09/01/21 02:07:17
もっぱら使う側が多いからじゃないのかな。特に不満もないし。。
鬼車のポジションを奪える可能性もあるからがんばって!

576:デフォルトの名無しさん
09/01/21 02:37:56
参考になるサイトもないでどうやって頑張るんだよ!
3日ぐらい悩んで大体めどがたってきたから別にいいけど。

577:デフォルトの名無しさん
09/01/21 07:29:45
要するにこういうことだろ。
いずれにしても、パターンの構文木()笑を作る必要はあるよ

/(ab(cd|ef)gh)/.match("xabefgh")
 /ab(cd|ef)gh/.match("xabefgh")
  /ab/.match("xabefgh")
  /(cd|ef)gh/.match("efgh")
  /(cd|ef)gh/.match("efgh")
   /(cd|ef)gh/.match("efgh")

578:デフォルトの名無しさん
09/01/21 07:29:58
途中で書き込んでしもた。めんどくせ

579:デフォルトの名無しさん
09/01/22 11:45:20
●正規表現の使用環境
prel

●検索か置換か?
置換

●説明
特定タグ間のHTMLタグを全て削除する
(<body>から</body>までのタグを全て削除)

●対象データ
<html>
<body>
テスト<BR>
<b>です。</b>
</body>
</html>


●希望する結果
<html>
<body>
テスト
です。
</body>
</html>

580:デフォルトの名無しさん
09/01/22 13:41:18
>>579
$html =~ s{(?<=<body>).+(?=</body>)} {
  (my $body = $&) =~ s/<.+?>//gs;
  $body;
}es;

581:デフォルトの名無しさん
09/01/22 14:08:55
>>579 のおかげで prel でぐぐっても perl が検索対象になることを知った

582:581
09/01/22 14:11:05
ごめん、正確には
prel 正規表現
など prel と何か別のキーワードでぐぐったとき prel は perl とみなされるっぽい

583:デフォルトの名無しさん
09/01/22 16:40:10
ワロタ

584:デフォルトの名無しさん
09/01/24 10:40:12
余談になるけど、VBSの正規表現は、処理系の実務にも耐えられるくらいの機能は持ってるよ。
条件判定としての正規表現を使える事は、VBAユーザーにとってこれ以上無いほどのメリットだと思ってる。

俺もそんなに正規表現は詳しくはないけど、エクセルで使う目的を考えると、VBSの正規表現は非常に使い勝手が良い。
良くも悪くもシンプルなんだよね。

仕事で文字列操作やRDBみたいな使い方してる人ならば、絶対に覚えておいて損はないよ。
後方参照が表現できるようになって、世界が開けました。
どうでも良い話かもしれないけど、マジでお勧め。

585:デフォルトの名無しさん
09/01/24 10:40:37
誤爆しました。すいません。

586:デフォルトの名無しさん
09/01/27 23:36:14
文字列の中から名前を取り出したいのですがどうやって書けば良いでしょうか

587:デフォルトの名無しさん
09/01/28 00:08:31
「名前」の定義は?
環境も。

588:586
09/01/28 00:46:35
名前は人名です
環境はVB.NETです。


589:デフォルトの名無しさん
09/01/28 00:51:34
人名の定義は?

590:デフォルトの名無しさん
09/01/28 00:56:14
それを聞いてる

591:479
09/01/28 03:07:22
形態素解析の領分だろうね。
どこまで固有人名を解析できるかは性能と元の文章次第だけど。

592:デフォルトの名無しさん
09/01/28 03:07:56
すまん、名前消したつもりが残ってた

593:デフォルトの名無しさん
09/01/28 06:56:44
辞書も必要だな

594:デフォルトの名無しさん
09/01/28 10:19:24
形態素解析までしなくても、日本全国の苗字と名前のテーブルを作って
「苗字+名前」で引っこ抜けばいいと思う

595:デフォルトの名無しさん
09/01/28 10:37:13
「あや」と「あやの」みたいのをどう
扱うかとか考え出すとなにげに難しい

596:デフォルトの名無しさん
09/01/28 11:34:07
英語と違って日本語は「わかち書き」をしないから難しいやろね。

597:デフォルトの名無しさん
09/01/28 18:51:36
(鈴木|佐藤|山田| ... )\s*(太郎|花子| ... )

598:デフォルトの名無しさん
09/01/28 19:16:08
>>586よ、別に煽って遊んでる訳じゃないぞ。
コンピュータにとって、言うは易いが行うは難しい要求なんだ。

599:586
09/01/29 01:12:20
レスありがとう
では郵便番号か都|道|府|県|市|区|町|村のある行から
5行以内にある行で、末尾に。や、のない7文字以内の行で
その行の中には、も。もない文字列
これを抜き取ったら名前の可能性が高そうなのですが
どうやって書けば良いでしょうか

600:デフォルトの名無しさん
09/01/29 01:52:27
>>599
それは非常に喜ばしいけれど、名前じゃないものが抽出されたり、名前が抽出されなかった時に
どうするか考えてるの?
そのデータをどうやって作ってるのかよくわからんが、ごちゃごちゃしたテキストしか存在しないの?

601:デフォルトの名無しさん
09/01/29 01:57:10
人名で7文字制限つけていいのかなぁ。外国人名なんか来た日にゃえらいことになりそうだが。

602:デフォルトの名無しさん
09/01/29 09:57:27
>>599
正規表現ってのは、
人間が生活しながら身に付ける区別みたいに複雑な物じゃなく、
字面だけで機械的に振り分けする物。
それが可能なデータでないなら、正規表現での抽出は諦めた方がいい。
既存のデータなら仕方ないけど、何等かの方法で生成してる物なら、
その上流で手を打たないと難しい。

603:586
09/01/29 22:51:11
レスどうもです
たくさんのデータを一気に処理をするという感じではないので
失敗したら手動で訂正するので大丈夫です。
ちょっと補助的に便利になればという感じで
100件やったら半分でも正常に抽出できればそれでもOKです。
今↓のように書いてみましたがこれだと

123-0001
東京都**区**町10-10
日本太郎
03-0000-0000

東京都**区**町10-10
03-0000-0000
日本太郎
123-0001

上の2つは大丈夫なのですが、

日本太郎
123-0001
東京都**区**町10-10
03-0000-0000

だと抽出できなかったのですが、どこを訂正したらいいでしょうか?

r = New Regex("((\d\d\d\-?\d\d\d\d|都|道|府|県)+?.+\n)*?(.*\n{1,5}?)(?<1>.{4,8})$\n.+?(\d\d\d\-?\d\d\d\d|都|道|府|県)*?\n?", _
RegexOptions.Multiline Or RegexOptions.IgnoreCase)

よろしくお願いします。


604:デフォルトの名無しさん
09/01/29 23:15:33
うざいので他所言ってください

605:デフォルトの名無しさん
09/01/29 23:33:20
>>603
パターンが一定ではないので無理。

606:デフォルトの名無しさん
09/01/29 23:35:34
とりあえず、「住所は必ず数字で終わる」のなら、
^(\D+)\d
で引っ掛けられそうか。

607:デフォルトの名無しさん
09/01/29 23:36:39
>>603
人名なんて住所より短いんだから、行頭から全角6文字以内+行末文字の抽出で十分じゃない。
はい終了。

608:デフォルトの名無しさん
09/01/29 23:43:23
まあそれでも半分ぐらいは抽出できそうだわな

609:586
09/01/30 00:02:42
こんにちは
とかが頭にある場合があるので郵便番号と都道府県のチェックは外せないです。

610:デフォルトの名無しさん
09/01/30 00:07:35
ネタじゃないの?

611:デフォルトの名無しさん
09/01/30 00:10:28
データごとの固まりは空行で区切られてたり
行数が決まってたりすんの?
それだったら名前候補を抽出するプログラムも結構簡単に作れそうだが
全部正規表現でやるのは逆にむずそう

612:デフォルトの名無しさん
09/01/30 00:13:59
>>609
そのレベルになってくると、正規表現よりそれを扱うスクリプトの方でどうにかしたほうがいいのでは

そもそもどういう形式のデータかも想像できないし

613:586
09/01/30 00:16:01
ネタじゃないです

データは一つはj一人のデータです。
複数の人の切り分けは考慮する必要なないです。
やっぱ難しいですかね

614:デフォルトの名無しさん
09/01/30 00:25:56
>>613
いやもう本気で「日本語でおk」
どんなデータか説明してもらわないと、どうもこうも無いわ。

615:586
09/01/30 00:44:15
わかりにくくてすみません。
自由なフォーマットで送られてくる住所氏名電話番号を
ListViewに登録するということをやっています。
文章は

こんにちは
私の住所は
123-0001
東京都**区**町10-10
日本太郎
03-0000-0000
です
お返事ください。

こんな感じの文章から名前を出来るだけ高確率で取り出したいです。
段階に分けて調べた方がいいですかね
上の例だとまず郵便番号と都道府県と電話番号の位置を正規表現で探して
それらに一番近い7文字の全角句読点なしを取るという感じでどうでしょうか
「です」が怪しいですね「になります」とか書いてあったら間違うし・・・




616:デフォルトの名無しさん
09/01/30 01:00:30
>>615
> 自由なフォーマットで
って時点で、正規表現の領域じゃないと思うぞ。

617:デフォルトの名無しさん
09/01/30 01:01:54
自由なフォーマットなのか、郵便番号に近いのと電話番号に近い奴が違った場合どっちを取る?
とか問題があるな。

URLリンク(www2s.biglobe.ne.jp)
この辺から苗字のリスト拾ってきてそれが含まれてる行を抽出するとかでいんじゃね?


618:デフォルトの名無しさん
09/01/30 01:08:18
人名辞書と突合せしないと絶対に無理だろ

619:デフォルトの名無しさん
09/01/30 01:15:22
名前だけ抜き出すと考えるとまず無理
引っかからないのもNGだとすれば、全角と空白を一定以上含む行まで絞ってあとは目視しかない
フリーフォーマットを許さないといけない特段の理由がないのであれば、フォームにするべき

620:デフォルトの名無しさん
09/01/30 01:30:30
出会い系?

621:デフォルトの名無しさん
09/01/30 01:48:20
っつーか、“理系”の人間に任せろよ。

622:デフォルトの名無しさん
09/01/30 03:59:14
つーかそこそこの確率でいいなら、漢字だけで構成されてる行を
抜き出すだけでよくね?

623:デフォルトの名無しさん
09/01/30 04:18:16
「できない」 ってハッキリ言ってやれよ。その方が質問主に対して親切だ。
こんなに引っ張るような事じゃ無いだろ。

624:デフォルトの名無しさん
09/01/30 05:24:29
だからネタでしょっていってんじゃん。
食いついたもん負け。

625:デフォルトの名無しさん
09/01/30 07:44:05
>>623
すると馬鹿は「知らないなら黙っててください」と言い出す

626:デフォルトの名無しさん
09/01/30 08:16:59
srud(>>625);

627:デフォルトの名無しさん
09/01/30 19:17:21
>>625
人のことを馬鹿呼ばわりするあなたにはわかるんですか?

わかる方のみ回答お願いします

628:586
09/01/30 20:15:38
レスどうもです。

漢字の数文字の行から取るというのはいいと思いますが
折角正規表現が使えるのだからそれと郵便番号と住所なんかを手がかりにしたい
(その分確率は上がるでしょうし)と思ったのでお力をお借りできないかと
このスレを訪れてみました。
ご指摘の無理というお話もわかりますがm住所、郵便番号...の条件について、
正規表現で書く書き方を教えて頂けると助かったのですが
範囲の指定とか除外とか色々あって難しくて・・・

ちょっとアプローチを変えて自分なりの方法でやってみました。
住所、郵便番号、電話番号の位置を調べて、それの平均値を出して
それに一番近い7文字の全角でかつ、。や、のない行
から文字を取るようにしたら結構良い確率で抽出するようです。
正規表現とは離れた手法になってきたのでこの件はこれで終わりにしたいと思います。
お騒がせしてすみませんでした。有意義な回答を下さった方ありがとうございました。



629:デフォルトの名無しさん
09/01/30 20:42:45
>>628
確実に除外できるものを削除しなよ。
そうすれば全部の名前に少しのゴミを加えたものになるよ。

630:デフォルトの名無しさん
09/01/30 21:40:39
まだ引っ張るつもりか

631:デフォルトの名無しさん
09/01/31 11:13:49
<h1 class="title">
<a target="_self" class="id a "
href="http://英数字.html">
パターンマッチング1</a>
      ・
      ・
     


$pattern = "/

(
<h1.\s.class=\"title\">
<a.\s.target=\"\_self\".\s.class="id\s.a\s\"
href=\"[0-9|a-zA-Z|\-|\:|\.|\?|\/|\_]+.\">
)
(.*?)(<\/a>)

/";


こんなので全然マッチングできませんでした
どこがまちがっているのか、おしえてください


632:デフォルトの名無しさん
09/01/31 11:30:33
>.\s.
任意の一文字+空白文字一文字+任意の一文字=計三文字
つまり"h1 class"とか"h1! ?class"とかじゃないと引っかからない。
h1とclassの間とかは「空白文字一文字以上」だから\s+でおk

633:デフォルトの名無しさん
09/01/31 11:31:19
>"h1 class"
2chの仕様でスペース一つに見えるけど、半角スペース三つね。

634:デフォルトの名無しさん
09/01/31 12:21:07
[ ]に | は使えないよ

635:デフォルトの名無しさん
09/01/31 13:38:00
質問なんですが、4桁の数字の頭にAという文字を付けたい場合、
[0-9][0-9][0-9][0-9]をどうやって置換すればいいんですか?

636:デフォルトの名無しさん
09/01/31 13:53:10
$str ='123b2345';
echo preg_replace('/[0-9]{4}/','A$0',$str);

-- 出力結果 --
123bA2345

637:デフォルトの名無しさん
09/01/31 14:04:13
正規表現関係ないじゃん…

638:デフォルトの名無しさん
09/01/31 14:38:44
>>632-633
助言ありがとうございます、.を取り除き進歩しました

今度は
$Pattern = "/([^<]h1*>[^a\s]*>)(.*?)(<\/a>)/";

のようにしてみたんですが、全然上手くいきませんでした


639:デフォルトの名無しさん
09/01/31 14:43:53
>>638
完全にスレ違いなので、お使いの言語のスレへいってくだしあ

640:635
09/01/31 15:09:36
教えろ

641:デフォルトの名無しさん
09/01/31 16:37:42
>>640
>>1

642:デフォルトの名無しさん
09/01/31 16:42:28
>>641
おまえ教えろ

643:デフォルトの名無しさん
09/01/31 16:53:04
>>642
>>1
>>636

644:デフォルトの名無しさん
09/01/31 17:31:16
教えられてもそれが答えと気づかなかったでござるの巻

645:デフォルトの名無しさん
09/01/31 17:38:44
ござる教えろ

646:デフォルトの名無しさん
09/02/01 00:07:27
URLリンク(www.pururu.co.jp)

647:デフォルトの名無しさん
09/02/01 00:42:14
>>646
つ それ「こざる」

648:デフォルトの名無しさん
09/02/01 01:09:08
答えを教えられていることを伝えたら答えを教えろと言われたでござるの巻

649:デフォルトの名無しさん
09/02/01 05:12:34
おしえろ教えろ

650:デフォルトの名無しさん
09/02/02 04:33:30
教えろおしえろオシエロ、、、エロ!?

651:デフォルトの名無しさん
09/02/02 07:54:44
そこでこざるの出番でござるよ

652:デフォルトの名無しさん
09/02/03 17:05:09
Perlの質問です。

.......<code>.......</code>......
....<code>...........</code>......

こんな感じのドキュメントを、<code>または</code>の前で区切ってsplitで分けようとして
書きましたがうまくいきません。何が悪いのでしょうか。

@content = split( /(?=<(|\/)code>)/, $content);

653:デフォルトの名無しさん
09/02/03 17:17:00
>>652
たぶん空文字列や'/'が混じるのが御気に召さないのだろうと
思うがそれは君が (|\/) でキャプチャーしているからだよ。
いらなければ (?:|\/) とか \/? とかにするといい。

654:デフォルトの名無しさん
09/02/03 17:26:39
>>653
迅速かつ的確なアドバイス、ありがとうございます。上手くいきました。
意味はこれから勉強していきます。

655:デフォルトの名無しさん
09/02/04 19:03:45
お願いします( ゚ω゚ ) 言語はC#を用いています。

正規表現にて
 [ok] 100
 [ng] 01 → 1
 [ok] 0.001
 [ng] 00 → 0
 [ok] 0.1000

前ゼロ入力をReplaceで""に置き換えたいのですが、正規表現が上手く書けませぬ
教えてくださいエロい人

656:デフォルトの名無しさん
09/02/04 19:29:16
関口宏「ベジータさん、今までいろいろな敵と戦ってきましたね?」

ベジータ「ふん、ゴミに興味などない」

関口、リーダー『ゴミに興味などない』

ベジータ「な……なんだ貴様ら!?」

リーダー「そんなベジータさんにはこんな問題!」

関口宏「ベジータさんが戦った、ギニュー特選隊のメンバー、五人全員お答え下さいスタート!」

リーダー「走って!まだよまだよまだよどうぞ!」

ベジータ「ギニュー! グルド! えー……バータ! ……待てよ、ギニュー、グルド、バー……くそ、わからん! あっ、ザーボン! なにっ!? ドドリア! くそったれ! ギニュー! グル」

ブッブー!

ベジータ「はぁ……はぁ……」

関口宏「リクーム、ジース」

ベジータ「あーリクーム……」

657:デフォルトの名無しさん
09/02/04 21:19:39
new Regex( @"^0+(?!\.)" )
でString.Emptyに置き換えてみたら

でもこれだと000は""になっちゃうけど

658:デフォルトの名無しさん
09/02/04 21:22:25
>>655

C#の構文は知らないのですが、

/^0+(\d)/$1/

に相当する正規表現でどうでしょうか

659:デフォルトの名無しさん
09/02/05 10:33:34
>>657
>>658
ありがとう(・ω・)
でもダメですた(;´Д`)

^0+(?!\.) 開始0の入力が不可ですた
/^0+(\d)/$1/  $1がサポられてないですた

お騒がせして申し訳ありませんでした。
もう少しイジくり回してみます。

660:デフォルトの名無しさん
09/02/05 11:13:55
秀丸エディタでの正規表現です。

abcdefghijxyz
abcdefg
xyzdefabc

から1行の中にabcとxyzの両方を含む行(1と3行目)を検索したいのですがどのように書いたらいいですか?

(.*abc.*xyz.*\n)|(.*xyz.*abc.*\n)
上のように書くとできるのですが含む文字列を増やした場合大変そうです。
本来はどのように書くのでしょうか教えてください。
簡単に&のような文字があるんでしょうか。

661:659
09/02/05 12:04:30
お騒がせしました(・ω・)出来まスタ スタ
解:System.Text.RegularExpressions.Regex(@"(^|(?=\.))0(?=[0-9])");
ありがとう御座いました。

662:デフォルトの名無しさん
09/02/05 13:24:20
>>660
URLリンク(www.din.or.jp)

663:デフォルトの名無しさん
09/02/05 14:27:14
>>660
^(?=.*abc)(?=.*xyz).*$

664:デフォルトの名無しさん
09/02/05 15:37:08
テキストファイルの検索でファイル内に複数の単語があるかどうか検索するときには
どういった感じにすればいいんでしょうか?


665:デフォルトの名無しさん
09/02/05 15:46:23
>>664
URLリンク(www.pururu.co.jp)

666:デフォルトの名無しさん
09/02/06 10:30:49
クラスの中でグループを使いたい場合はどうしたらいいですか?

[123(456)]
とした場合1/2/3/456にマッチする。

667:デフォルトの名無しさん
09/02/06 10:32:36
中じゃなく外でやれ。
([123]|456)

668:デフォルトの名無しさん
09/02/06 11:17:30
なるほろろ

669:デフォルトの名無しさん
09/02/06 13:05:59
いやん。中に出して!

670:659
09/02/06 18:08:08
>>667 悔しいけど感じちゃう ビクンッビクンッ

671:デフォルトの名無しさん
09/02/06 20:46:31
janeviewでwsh使用してますが、
2000にマッチして、DATE: 2000にはマッチしないようにしたいのですが
どうしたらいいですか?

672:デフォルトの名無しさん
09/02/06 22:10:55
(?<!DATE:)2000

かな。たぶん・・・
>>2
URLリンク(www.kt.rim.or.jp)
を読んで。

673:デフォルトの名無しさん
09/02/06 22:14:47
おっと、WSH か・・・ダメかもしれないね。
if文で2重チェックすればいいんじゃない?

674:デフォルトの名無しさん
09/02/06 22:22:42
>>2
.NET Framework 正規表現言語要素
URLリンク(msdn.microsoft.com)
にちゃんと書いてあった。
.NET なら (?<!・・・・) が使えるみたいだけど、WSH はよくわからん。どこに書いてるんだろう・・・

675:デフォルトの名無しさん
09/02/06 22:28:02
WSH(JScript)の正規表現は↓でおk
URLリンク(msdn.microsoft.com)

676:デフォルトの名無しさん
09/02/06 22:29:02
ググったら出てきた。

正規表現による Visual Basic Scripting Edition (VBScript) の機能強化
URLリンク(msdn.microsoft.com)

ここには (?<!・・・) は書いてない。
書いてないから出来ない、と考えるべきか、メンドクサイから書かなかったのか。
出来ることは書くが、出来ないことは書かない。フツウ、そうだよな・・・
ちなみに文書の日付は May 10, 1999 だ。
自分で実験してたしかめろや。

677:デフォルトの名無しさん
09/02/06 22:32:59
>>675 そっちのが新しい文書やね。やっぱり (?<!・・・) は書いてない。

678:デフォルトの名無しさん
09/02/06 22:42:20
鬼車使えばいいじゃん

679:デフォルトの名無しさん
09/02/07 03:54:02
>>672-678皆さんありがとうございます。

>>678さん
いつのまにか鬼車ってやつに変わってたんですね
ヘルプの更新してなかったので気が付かなかったです。

鬼車にしたら>>672さんのやり方で出来そうだったんですけど、
なぜか、「正規検索のテスト」のウィンドウ上だとうまく出来てるみたいなんですが、
実際に「ログから検索」にかけるとDATE: 2000が掛かってしまうみたいです。(でもハイライトされない)

結局、検索を本文のみに絞るオプションを発見して一応望む結果は出せたのですが、
何故そうなるのか、どうもしっくり来ないです…

逆に(?<=DATE: )2000でログ検索かけてみると今度は全くマッチしない状態になります。
でもテストウィンドウ上ではちゃんとマッチするんですよね…。
なんかおかしい気がします。Janeのバグなんでしょうかね?

680:デフォルトの名無しさん
09/02/07 20:12:26
URLリンク(hoge.net)桁の数字/3桁の数字.jpgというURLがあります
最後の「3桁の数字.jpg」を抜き出した意のですが、どのようにやったら綺麗にかけますか?
ヒントをください

681:デフォルトの名無しさん
09/02/07 20:16:20
/[0-9][0-9][0-9].jpg$/

682:デフォルトの名無しさん
09/02/07 20:41:09
/[0-9][0-9][0-9]\.jpg$/

683:680
09/02/07 20:52:29
わかりました感謝します

684:デフォルトの名無しさん
09/02/07 21:33:57
/\d{3}\.jpg$/

685:デフォルトの名無しさん
09/02/09 19:35:31
gawkの質問です。
村にはヒットさせたいが、川村とか大村とか村の前に特定の文字がついた場合にはヒットしたくない場合、正規表現ではどう書けばいいでしょう?
/![川大]村/
とかでいいんでしょうか?


686:デフォルトの名無しさん
09/02/09 21:35:40
/[^川大]村/

687:デフォルトの名無しさん
09/02/09 21:52:07
ありがとうございました。

688:デフォルトの名無しさん
09/02/09 22:03:09
これだとただの「村」にはマッチしないんだよな

689:デフォルトの名無しさん
09/02/09 22:11:32
正規表現は難しいからね。これ自体が一つのプログラミング言語と同等だし。

690:デフォルトの名無しさん
09/02/09 22:13:29
いや、それはない

691:デフォルトの名無しさん
09/02/10 01:21:53
/[^川大]村|^村/

これはどうかね

692:デフォルトの名無しさん
09/02/10 08:51:21
後方一致
/(?<![川大])村/

693:デフォルトの名無しさん
09/02/10 09:55:50
gawkでって話だから戻り読みはなしだろう。


694:デフォルトの名無しさん
09/02/10 23:02:24
●正規表現の使用環境
サクラエディタ v1.6.4.0

●検索か置換か?
置換

●説明
「 xml:space=preserve>」を検索のキーとして
キーを含む行末までの文を置換したい

●対象データ
<string1 xml:space=preserve> </string1>
<string2 xml:space=preserve>     </string2>

●希望する結果
<string1/>
<string2/>

よろしくお願いします

695:デフォルトの名無しさん
09/02/10 23:27:10
s/<[^>]*xml:space=preserve>//g、でどうかな。

696:デフォルトの名無しさん
09/02/11 01:01:41
* で貪欲マッチするとマズいか。
最初の文字が x だから、
s/<[^x]*xml:space=preserve>//g、でどうだ。

697:デフォルトの名無しさん
09/02/11 13:40:25
>>694

s/<([^\s]+)\sxml:space=preserve>[^\n]+<\/\1>/<\1\/>/g

でどうでしょう。

698:デフォルトの名無しさん
09/02/11 13:44:59
s/<([^\s]+)\sxml:space=preserve>[^\r\n]+<\/\1>/<\1\/>/g


改行コードが文字コードによっていろいろなので少し修正
XMLが複雑な入れ子構造だとうまく動作しない場合がありえますが
シンプルな構造で、閉じタグも同じ行にあるのなら大丈夫かも。
サクラエディタは持ってませんが()でのキャプチャは\数字で参照できるようですね。

699:デフォルトの名無しさん
09/02/11 13:47:57
s/<([^\s]+)\sxml:space=preserve>[^\r\n]+<\/\1>/<$1\/>/g


こういう風にも書けるのかな

700:デフォルトの名無しさん
09/02/11 15:55:48
Perl互換の正規表現に対応しているソフトで

ab
cd

を検索するのに /ab.cd/m と書いたのにヒットしません。
/ab.*cd/m も /ab\ncd/m もダメです。バグでしょうか?

701:デフォルトの名無しさん
09/02/11 16:42:50
>>700
そのソフトの名前を出してくれないならどこまで互換性あるのかわからないし
作者かユーザーに聞けとしか。

702:デフォルトの名無しさん
09/02/11 17:15:32
>>700
ほんとうにperl互換なら、s オプションをつければいいと思う。

/ab[\r\n]*cd/s

703:デフォルトの名無しさん
09/02/11 18:09:38
>>701
このeDocArrangementというソフトです。業務用なので値段がすごいです。試用版で勉強中です。
OCR結果から顧客名を取り出す作業をしたいと思いまして。。。
URLリンク(www.technostyle.net)
>>702
ありがとうございました。出来ました。
\nだけではダメなんですね。詳説正規表現を読み始めたところですが、そんなことは書いてないような気がします。
別の教科書を探すべきでしょうか?

704:デフォルトの名無しさん
09/02/11 18:12:36
>>703
\r\nなのはWindows環境だからじゃないの?
それでもオープン時にテキストモード指定してれば\nでいいけど。

705:デフォルトの名無しさん
09/02/11 18:18:46
>>704
はい。窓です。正規表現の世界では異端なんですねw


706:デフォルトの名無しさん
09/02/11 18:28:21
そもそもそのデータはどうやって持ってきてるの?
もしもデータがファイルにあって、ファイルオープンのコードを自分で書いたのなら
そのパラメタが間違ってるよ。

707:デフォルトの名無しさん
09/02/11 18:46:37
>>706
OCRデータから目的のテキストだけを抜き出す作業です。
xdwファイルにOCRデータがありまして

氏名
西村ひろゆき
生年月日


というデータから名前を抜き出す作業です。
/氏名\n(.*)\n生年月日/m で抜き出せると思って試行錯誤したんですが、うまくいかなくて泣きついた次第です。
ファイルオープンのコードをかくという作業はありません。というか、低レベルなのでそういう高度な作業はよくわからない状態です。。。

708:デフォルトの名無しさん
09/02/11 18:52:31
>>703
もし、正規表現を使い始めたばかりなら、詳説正規表現はまだ読むべきじゃない。
読むならまず入門書から入るべきかと。

709:デフォルトの名無しさん
09/02/11 18:56:53
>>708
ありがとうございます。たしかに自分には早いのではないかという気がしていました。
はっきりと断言していただきありがとうございます。初心者用の教科書をAmazonで探します。
もしもお勧めがあれば、ご教示いただけましたら幸いです。希望ばかりで大変心苦しいのですが。。。

710:デフォルトの名無しさん
09/02/11 19:24:02
>>705
行の末尾がOSによって異なるんだよ。
 \n だけのOS(うにくす系)
 \r だけのOS(りんご系)
 \r\n 両方必要なOS(まど系)
(ここまでは、パソコンの基礎知識)

この3種類に共通に使えるように
[\r\n]*
って書くんだよ。
(これは正規表現の応用問題。よく使う慣用句みたいなもの)

711:デフォルトの名無しさん
09/02/11 19:24:13
自分はPerl本から入ったクチだけど、>>709の場合、
Perlの処理部分については必要ないよね、おそらく。

特に正規表現に関して言うなら、試行錯誤して身につけたものの方が多い。
一番参考にしたのは秀丸のヘルプだったりする。

だから本を買う前に、Googleで正規表現を検索して、トップ30ぐらいまでの
ページを順に読むほうがよいかと。

テキストエディタでの正規表現の利用方法を記載しているものもあるけど、
それらも基本は同じだから、まずそこでイメージを掴むべきかと。

本を買うのは、その後。、少しでも自分のイメージができた後で書店で中身を
確認して買うべきだと思う。

最近のテキストエディタは検索結果に一致する箇所にマーカーをするものもあるから、
それで勉強するのもベストかと。

自分が知っている分では秀丸とSakuraエディタ。それ以外にもあるとは思う。

712:デフォルトの名無しさん
09/02/11 20:34:50
俺のオススメは >>2 のいちばん最初に書いてある
 正規表現メモ
 URLリンク(www.kt.rim.or.jp)
だな。

713:694
09/02/11 21:33:37
>>695-699
お答えいただき、ありがとうございました
早速試してみたのですが、検索に引っかかりませんでした…

714:デフォルトの名無しさん
09/02/11 22:57:49
>>713

サクラエディタを使ったことないので、サクラエディタでの置換方法は分からないのですが

<(\S+)\sxml:space=preserve>[^\r\n]*<\/\1>

で検索にヒットしないでしょうか?
あとは、それを

<$1\/>

に換えるだけですむのですが・・

715:デフォルトの名無しさん
09/02/11 22:59:51
714では、

 [^\r\n]+



 [^\r\n]*

にしました

716:デフォルトの名無しさん
09/02/11 23:28:16
っつーか、>>695のsed式での回答ってどうなんだろう?
個人的には、環境に左右されないからアリだと思うんだけど。
スラッシュで囲むっていう知識は前提にしていいのかな?

717:694
09/02/12 01:29:13
>>714
出来ました!ありがとうございます!
しばらく頑張ってたのですが、どうにもうまくいかず参ってたところでした
本当にありがとうございました!

718:デフォルトの名無しさん
09/02/12 02:18:07
>>716

まあ正規表現だってのをはっきりさせるのはいいと思うけど、
スラッシュ以外も区切りにできる(できないのもあるけど)というのを
知らない人がさらに増えるようなきがするのはやだなあ。


719:デフォルトの名無しさん
09/02/12 08:50:34
>>718
なんか論点が違う気も。

720:デフォルトの名無しさん
09/02/13 02:32:08
Firefoxのjavascriptを使って、

<div class="mori">
<h2>てすと</h2>
<img src="./test.gif">
</div>
<div>わわわ</div>

のようなHTMLからclassがmoriの上四行の部分を抜き出したいのですが、正規表現を

<div class="mori">(.|\n)*<\/div>

とすると最後の<div>わわわ</div>まで入ってしまいます。
次に

<div class="mori">[^(</div>)]*<\/div>

を試してみたのですが、これもうまくいきません。
角カッコの中は丸カッコで囲んでも無視されて一文字ずつに分解されてしまうようです。
どうすればいいんでしょうか?

721:デフォルトの名無しさん
09/02/13 03:26:11
>>720
*や+は最も長く貪欲にマッチしようとするから、最後の</div>にマッチする。
*や+の直後に?を付ければ最小マッチになってできる限り短くしようとするから
望むような結果になるはず。


722:デフォルトの名無しさん
09/02/13 10:14:34
JavaScriptならDOMで操作しないさいよ…


723:デフォルトの名無しさん
09/02/13 20:04:39
>>721
おおおおお!まさにこれを求めていました!
いろんな場面で使えそうでとても助かります。どうもありがとうございます。

>>722
それがGM_xmlhttpRequestで得る値なので、全部テキスト形式になってしまうのです。

724:デフォルトの名無しさん
09/02/14 12:09:33
phpで正規表現を使うかプログラムでゴリゴリ書くか迷ってます
やりたい事は、見出し語:[発音,][定義1][,"例文1","例文2",...][ *注記][; 定義2...]みたいな
テキストを分解して各(配列)変数に設定する、みたいな事なのですがpreg_match_allみたいな関数で
この程度なら実現可能そうでしょうか?
既に結構時間を使ってるので見込みが無さそうならサッサと見切りを付けたいのですが…


725:デフォルトの名無しさん
09/02/14 12:51:03
全部ちゃんと分割できるよ

726:デフォルトの名無しさん
09/02/14 13:28:57
うっ…出来るんですか。(まだ定義の分割すら碌に出来てない…)
もう少し頑張ってみます

727:デフォルトの名無しさん
09/02/14 20:45:00
[*]の[]を普通の文字として扱いたいときどうすればいいんですか?

\[*\]だと無理ですよね

728:デフォルトの名無しさん
09/02/14 20:49:38
ふつうは \[*\] でいいんだよ。ふつうは。

729:デフォルトの名無しさん
09/02/14 20:59:08
そうですか・・・
\[*\]だと]しかクォートされないので・・・

730:デフォルトの名無しさん
09/02/14 21:21:17
[[]*\]

731:デフォルトの名無しさん
09/02/14 21:40:27
やはり]だけでした

732:デフォルトの名無しさん
09/02/14 21:45:24
それをどうやって確かめてるんだ

733:デフォルトの名無しさん
09/02/14 21:53:05
アナログ放送をIEPGで登録すると[S]や[字]といった文字が名前に付きこれが邪魔なのでリネームしたいんです
たとえばファイル名[S][字].avi
s/\[S\]//
してやるとファイル名[字].avi
となりますが
s/\[*\]//
とするとファイル名[S[字].avi
といった感じになります


734:デフォルトの名無しさん
09/02/14 21:57:33
>>733
頭悪いのに勝手に自分で問題を切り分けずに、最初からそれをいえよw

*の使い方しらべとけ

735:デフォルトの名無しさん
09/02/14 22:00:07
わからないんですね
すいません

736:デフォルトの名無しさん
09/02/14 22:00:43
「頭悪い」なんていきなり何様ですか
わからないならわからないと言えばいいじゃないですか

737:デフォルトの名無しさん
09/02/14 22:17:22
どっからどう見ても最初に質問した奴と途中の奴が別人w

738:デフォルトの名無しさん
09/02/14 22:19:09
s/\[*m9(^Д^)\]//

739:デフォルトの名無しさん
09/02/14 22:28:42
s/\[..*\]//

740:デフォルトの名無しさん
09/02/14 23:26:05
>733

横レス失礼します。

s/\[[^\]]*\]//g

これでどうでしょうか?

741:デフォルトの名無しさん
09/02/14 23:33:42
>>733

s/\[.*?\]//g


これでも大丈夫でしょう。
最短マッチに対応している正規表現エンジンの場合は。

*や+は条件に合致しつつできるだけ多くの文字を消費するような選択をします。
*?、+?は最短マッチといって、その条件を満たす最短の場合が選ばれます。
想定される用途では否定の文字クラス [^いろいろな文字] を使うか
最短マッチの .*? を使われると良いとおもいます。
別の表現なら否定先読み (?!文字列) をつかっても長くなりそうですが書けます。
ご参考になれば幸いです。

742:デフォルトの名無しさん
09/02/15 10:10:19
>>733
最初からそれを書け。
コミュニケーション能力不足。
人間相手にコミュニケーションできないで
コンピュータ相手のコミュニケーションが出来ると思うのか?

s/\[[S字]\]//

743:デフォルトの名無しさん
09/02/15 15:20:54
補足です。
>>741の正規表現は*の前に見づらいかもしれませんがピリオド.があるのでご注意ください。


>>733の正規表現 /\[*\]/ にヒットする文字列はたとえば

]
[]
[[]
[[[]
[[[[]
[[[[[]

になります。

744:デフォルトの名無しさん
09/02/15 17:02:57
いくらなんでも初歩で躓きすぎだろ
質問に無関係な知識押し付けてる方もひどいが

745:デフォルトの名無しさん
09/02/16 00:02:06
>>742が一番馬鹿に見える

746:デフォルトの名無しさん
09/02/16 00:17:40
キラーパスだな

747:デフォルトの名無しさん
09/02/16 03:22:04
>>742はネタだろJK

748:デフォルトの名無しさん
09/02/18 14:12:37
++とか(?>)とかのpossessive quantifierってどういうときに使ったっけ?
あれば便利そうは気はするし、実際なんかで使った記憶はあるんだけど思い出せない

749:デフォルトの名無しさん
09/02/18 18:05:15
わからないから聞いてるならまだしも、忘れたから聞いてるってのはそれこそググレば?

750:デフォルトの名無しさん
09/02/19 20:45:50
すいません質問させてください

①/home/test/hoge/test/test.txt
②/home/test/hoge/test/document.txt
↑のパスがありまして、そこからtestで検索をすると
①のtext.txtのみが該当する正規表現ってうまく出来ないものでしょうか?
ファイルまでの途中のパスは含めないで最後のスラッシュ後のファイル名のみ
検索対象としたいのですが悩みまくりです・・・
イメージ的にはエディターでの正規表現で①のみ該当させる感じです。
どなたかご教授願えないでしょうか?

751:デフォルトの名無しさん
09/02/19 20:58:11
C#を使っています
string か strin か stri か str か st か s
にマッチするパターンを今は↓のように書いているんですが
^s(t(r(i(n(g)?)?)?)?)?$
もっと分かりやすい書き方ってありますか?

752:デフォルトの名無しさん
09/02/19 22:42:23
>>750
検索キー 「test.txt」

753:デフォルトの名無しさん
09/02/19 22:44:47
>>750
/([^\/]+\/)*(.*)/ で、\1がパス、\2がファイル名。

754:デフォルトの名無しさん
09/02/19 22:54:31
>>750
秀丸エディタなら↓これでいけた。他は知らん
(?<=.+/)test

755:デフォルトの名無しさん
09/02/19 22:57:56
>>750

test\.txt$

でどうでしょう

756:デフォルトの名無しさん
09/02/19 22:59:13
>>750

少し修正

test\.txt[\r\n$]

757:デフォルトの名無しさん
09/02/19 23:00:16
ひどくなってるYO

758:デフォルトの名無しさん
09/02/20 00:01:43
test\.txt(?=$|\b|[\r\n])

759:デフォルトの名無しさん
09/02/20 02:53:45
YoutubeをダウンロードするFirefoxのuserchrome.jsスクリプトの一部なんだけど
var[ \r\n\t]+swfArgs[ \r\n\t]*=[ \r\n\t]*\{(.*,|)[ \r\n\t]*(t|'t'|"t")[ \r\n\t]*\:[ \r\n\t]*['"]([a-zA-Z\-_0-9]+=)['"].*\}
の(.*,|)の意味するところがわからない。    ↑
|って○○か××を意味するメタ文字じゃないの?なんで)の直前にあるんだろう?

760:デフォルトの名無しさん
09/02/20 03:00:42
(foo|) は (foo)? と同じ意味では。

761:デフォルトの名無しさん
09/02/20 03:13:23
.*0か1個以上ある?じゃあ.+と同じ?

762:デフォルトの名無しさん
09/02/20 08:04:22
はあ?

763:750
09/02/20 08:57:02
みなさんレスありがとうございます
例えが悪かったですが実現したいのはデスクトップの検索エンジンでのファイル名検索でファイル名のみで検索したいのです。
みなさんのレスを参考に思考錯誤してみます

764:デフォルトの名無しさん
09/02/20 20:27:44
>>759
"t": "([^"]+)"
俺は、これで済ませてるw

765:デフォルトの名無しさん
09/02/20 21:39:41
すみません(foo)?の意味がわかりません教えてください

>>764
それでいけるよねw

766:デフォルトの名無しさん
09/02/21 21:02:25
>>751
C#なら
s.Length > 0 && "string".StartsWith(s)
のようにやればいいのに。

767:デフォルトの名無しさん
09/02/23 19:43:45
女のコの性器表現てどれくらいの種類があるんだろう


768:デフォルトの名無しさん
09/02/23 19:56:18
単語だけならともかく、そんなのは文脈によって変わるし、
『×××』だけでもそれを表すことができる上に、『大事なところ』などボカした表現までスコープを広げると
とても現代の正規表現で賄いきれるものではない。
言語学の分野で議論してくるがいい。

769:デフォルトの名無しさん
09/02/24 18:45:51
C#でWBCかワールド・ベースボール・クラシックのどちらかを含み、かつイチローか松坂のどちらかを含むline、と正規表現で
if (Regex.Match(line,"(WBC|ワールド・ベースボール・クラシック) && (イチロー|松坂)").Success)
と書いてみたのですが、いまいちうまくヒットしないです。アドバイスお願いします。


770:デフォルトの名無しさん
09/02/24 20:15:33
正規表現の中に && とか画期的すぎるだろ・・・
テンプレの正規表現講座でも見ておいで

771:751
09/02/24 22:56:03
>>766
確かにその方がわかりやすいですね
ありがとうございます

772:デフォルトの名無しさん
09/02/25 10:58:18
if (Regex.Match(line, "(WBC|ワールド・ベースボール・クラシック)").Success && Regex.Match(line, "(イチロー|松坂)").Success)
でいいんじゃね?C#知らないけど。
AND増えるなら条件を配列に入れてループで。

773:デフォルトの名無しさん
09/02/25 12:46:56
line = "ぽにょワールド・ベースボール・クラシックぽにょイチローぽにょ"

Set RegExp1 = new RegExp
Set RegExp2 = new RegExp
RegExp1.Pattern = "WBC|ワールド・ベースボール・クラシック"
RegExp2.Pattern = "イチロー|松坂"

If RegExp1.Test(line) And RegExp2.Test(line) Then
Wscript.Echo "うんこ"
End If


774:デフォルトの名無しさん
09/02/25 12:49:30
>>772
Regex.Match の使い方が間違ってる。ちゃんと説明書読んだ?

775:デフォルトの名無しさん
09/02/25 14:22:03
C#知らないと言っている人にそんな指摘してもなあ

776:デフォルトの名無しさん
09/02/25 15:22:22
C# カンケーない。Regex.Match の使い方が間違ってる。

777:デフォルトの名無しさん
09/02/25 15:42:59
>>769>>772

if (Regex.Match(line, "WBC|ワールド・ベースボール・クラシック").Success && Regex.Match(line, "イチロー|松坂").Success)

で良いが、IsMatchのほうが良さげ。

if (Regex.IsMatch(line, "WBC|ワールド・ベースボール・クラシック") && Regex.IsMatch(line, "イチロー|松坂"))

778:デフォルトの名無しさん
09/02/27 19:33:25
少しお聞きします。

1hage(100禿)
1hage(10毛)
1hage

という文字列があった場合に、1hage(100禿)以外をマッチさせたいのですが、
なかなかうまくいきません。
どのように正規表現を書いたものでしょうか?


779:778
09/02/27 19:34:25
>>778
すいません。追記です。
具体的には、"hage"をヒットさせたいのですが、"禿"を含むもののみマッチさせないようにしたいのです。

780:デフォルトの名無しさん
09/02/27 19:36:03
1hage にマッチしたものから 1hage(100禿) にマッチするものを取り除く、
じゃダメなのか? どうしても1個の正規表現でやんないとダメ?

781:デフォルトの名無しさん
09/02/27 20:30:52
>>780
うん、やっぱりそれの方がスマートでよいですよね・・・
わかりました。

無理に正規表現だけでやらないとことにします。
ありがとうございました。

782:デフォルトの名無しさん
09/02/28 14:16:03
文章中に「A」と「AA」が混在していて、
1文字だけの「A」を2文字の「AA」にします。
2文字以上連続していない、1文字だけの「A」は
どうやったら探せますか?
/A{1}/ でも駄目ですし、/A[^A]/ だと
行の中に A しかない物が引っ掛かりません。

783:デフォルトの名無しさん
09/02/28 16:40:50
D:\jspsh>jspsh.exe
js> "A AA AAA".replace(/(^|[^A])A([^A]|$)/g, "$1AA$2")
AA AA AAA
js> :q
Leaving "JScript Power Shell"

784:デフォルトの名無しさん
09/02/28 21:51:49
タイ━━||Φ|(|´|Д|`|)|Φ||━━ホ

785:デフォルトの名無しさん
09/02/28 23:10:33
>>783
ありがとう、試してみます。

786:デフォルトの名無しさん
09/03/02 20:45:20
/(?<!A)A(?!A)/

787:デフォルトの名無しさん
09/03/07 00:28:35
<A href="○○○○○○○">●●●●●</a>

<A href="○○○○○○○"><hogehogetag>●●●●●</hogehogetag></a>
という文字列から●●●●●を取り出したいのですが
どうやって書いたら良いか教えてケロ
決まってるのは<A href="○○○○○○○">の次の<>の外の文字列ということです。

788:デフォルトの名無しさん
09/03/07 01:14:08
>>5みたいに書けばいいよ

789:デフォルトの名無しさん
09/03/12 17:29:29
「から最初の」までってどうやって抜き出すんですか?教えてください

790:デフォルトの名無しさん
09/03/12 17:40:07
「[^」]*」

791:デフォルトの名無しさん
09/03/12 17:53:29
ありがとうございました

792:デフォルトの名無しさん
09/03/13 00:14:55
SQL(SELECT、UPDATE、INSERT、DELETEが不明)から、
テーブル名をマッチさせる正規表現が解る方、どなたかいらっしゃらないでしょうか?

ひとつの表現で不可能なら、複数でもいいのですが…(´・ω・`)

793:デフォルトの名無しさん
09/03/13 00:25:51
SQLの構文解析は正規表現じゃ無理

794:デフォルトの名無しさん
09/03/13 01:07:40
金額の文字にマッチするにはどう書けばよいですか?
123,456,789 ←こういうの

795:デフォルトの名無しさん
09/03/13 01:20:24
\d{1,3}(,\d\d\d)* かな

796:デフォルトの名無しさん
09/03/13 08:53:14
複雑な正規表現のテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。


797:デフォルトの名無しさん
09/03/13 08:57:59
製品名を「鼻から悪魔」にしておけば何も問題は無い

798:デフォルトの名無しさん
09/03/13 12:11:43
>>796
私も以前、このスレではない所で同様の質問をしたが、真面目な答えは
返ってこなかったよ。正規表現から見るとプログラムテストは鬼門かもね。


799:デフォルトの名無しさん
09/03/13 12:21:24
複雑なC言語プログラムのテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。

複雑なjavaのテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。

複雑なPHPのテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。

複雑なバッチファイルのテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。

複雑なExcelマクロのテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。

・・・正規表現に限った話ではない。

>自分に都合のいいデータだけ作ってやってるけど。
問題の原因がハッキリわかってるじゃないか。それを対処すればいいじゃないか?
自分に都合のいいデータを作ってしまうのが問題なら、他人にデータを作ってもらえばいい。

800:デフォルトの名無しさん
09/03/13 12:42:08
>>796
やったことはないが、本気でやるなら、こんな感じになるんだろう。

1.マッチすべきパターンについて構文木を作る
2.構文木を元に直交表を作る
3.実験計画法でテストケースを作る
4.テストケースをテストプログラム化する


801:デフォルトの名無しさん
09/03/13 14:59:43
>>799
プログラム言語の場合はステップごととか、プロセジャーや
関数に分割してテストするし、型も助けになる。
正規表現の対象としているのは文字列でここから先は構文解析
しかない。複雑な組み込みシステムの入口、出口でどんな
テストデータを用意すればよいかというのと類似した問題だ。

802:デフォルトの名無しさん
09/03/17 13:26:09
URLリンク(www.honya-town.co.jp)
上記のwebページから以下の「マンガホーキング入門」の部分を取り出したいのですがうまくいきません
<tr>
<td bgcolor="#efefef" width="15%" align="center" nowrap><small>
書  名 </small></td>
<td width="85%"><font color="#333399" size="+1"> <strong> マンガホーキング入門 </strong> </font></td>
</tr>

"<strong>(.+?)</strong>"だとここ以外の強調部分もマッチしてしまうので
"書.*?名.+?<strong>(.+?)</strong>"のようにしたのですがこれだとひとつもマッチしてくれません
どのようにするべきなのでしょうか?

803:デフォルトの名無しさん
09/03/17 13:28:20
あれ、書 名 の部分は実際は書&nbsp;&nbsp;名です(&=>&)

804:デフォルトの名無しさん
09/03/17 13:36:57
自己解決しました
「.」は\nを含まないのでだめだったようです
"書.*?名.+?\n.+?<strong>(.+?)</strong>"でいけました
スレ汚しすみませんでした

805:デフォルトの名無しさん
09/03/20 21:51:43
JavaやC#に正規表現のコンパイル機能があるけど、あれって意味あるのかな?
いつも可読性を優先してRegex.Match(data,pattern)みたいに直接使ってるんだけど、
コンパイルが必要になるほど性能が必要な正規表現ってどんなのがあるん?

806:デフォルトの名無しさん
09/03/20 22:00:44
>>805
一般論的に正規表現のコンパイルというと、何度も同じ正規表現を
使うときに差が出る。
それが有意な差になるかはプロファイル取ってみないとわからないけど。

ところで可読性なら生の正規表現よりも定数とかに入れて
名付けた方がいいんじゃない?めんどくさいけど。

807:デフォルトの名無しさん
09/03/20 22:06:30
>>805
perlでo使ったらうれしいときと同じだよ。

808:デフォルトの名無しさん
09/03/20 22:09:58
>>806
>ところで可読性なら生の正規表現よりも定数とかに入れて
>名付けた方がいいんじゃない?めんどくさいけど。

コード体系とかのパースの場合は定数化してるよ。
"Key: Value"なデータのパースとかはハードコードかな。
わざわざファイル移動で確認させる価値もないし。

809:デフォルトの名無しさん
09/03/21 02:47:41
ルールを変更可能にするため外部化、ってのもよくあるパターンだと思うけど。

810:デフォルトの名無しさん
09/03/26 17:50:58
hoge.out.csvを引っ掛けないで、mage.csvやhage.csv
を引っ掛けるにはどう書いたらいいんでしょうか?
.*\.csvを引っ掛けたいのですが、.outが含んでいるときはだめ、という形です。

/[\w\0-9]+(?!\.out)\.csv/
みたいに書いてみたのですが、.out.csvも.csvもともに引っかかってしまいます。

811:デフォルトの名無しさん
09/03/26 18:01:21
>>810

/(?<!\.out)\.csv/

812:810
09/03/26 19:59:19
>>811
ありがとう。

結局こんな感じで行けました。
/^[^\.]*(?!\.out)\.csv/



813:デフォルトの名無しさん
09/03/26 22:41:48
>>812
それ単に.csv以前に「.」を含まないものにマッチだから、

hoge.hoge.csv

はマッチしないけどそれでいいの? .outは含んでないよ。



814:デフォルトの名無しさん
09/03/27 00:05:41
>>812
否定先読みはきちんと理解出来てる?
もう一度パターン眺めてみると良いかも。

815:デフォルトの名無しさん
09/03/29 11:05:44
すみません、似た質問になるのですが
ファイル名が1行の中に列挙されていて
たとえば、hoge1.zip hoge3.zip hoge5.exe のような場合に
行中に .zipでない拡張子が含まれるという条件にマッチする正規表現は可能でしょうか。
ファイル名の区切りは、スペースを仮定します。

816:デフォルトの名無しさん
09/03/29 11:58:50
.+\.(?!zip).{3}

こんな感じ?拡張子は3文字として決め打ちしてるけど。
ファイルとファイルの間にスペースがあるなら、スペースまでのマッチに工夫すれば良いと思うよ。



817:デフォルトの名無しさん
09/03/30 23:57:55
vbsです。
1.txtを\dでマッチさせようとしているのですが、
01がマッチしてしまいます。
a.txtを\Dで待ちさせようとすると
0aがマッチしてしまいます。
どうして2バイトになるのでしょうか?


818:デフォルトの名無しさん
09/03/31 00:30:47
確認方法が間違ってるんじゃね?

819:デフォルトの名無しさん
09/03/31 01:18:23
>>818
そうでした。すみません。

820:デフォルトの名無しさん
09/04/05 23:29:32
●正規表現の使用環境
.NET 1.1 (C#)

●説明
テキストボックスに入力された文字の最後が
大文字小文字関係なく .csv と入力されているか
判断したいです。

if (textBox1.Text.EndsWith(".csv"))
とすると、小文字のcsvでないとTRUEを返してくれません。

.NET2.0以上なら、EndsWith(".csv", 大文字小文字無視)
のように書けるのですが、1.1だとそのメソッドがありません。

恐れ入りますが、ご教授おねがいします。

821:デフォルトの名無しさん
09/04/06 00:04:39
素直な方法が使えないなら、多少は面倒だけど
うしろから4文字を取ってきて、小文字化してから".csv"と比べるとか。

822:デフォルトの名無しさん
09/04/06 00:30:59
>>821
あっ、その方法がありましたね。
自分の頭が固かったです。

文字列を一旦小文字にしてから
比較することで無事解決できました。

どうもありがとうございました。

823:デフォルトの名無しさん
09/04/06 20:31:31
何にもマッチしない正規表現というのは表現可能でしょうか?
どのように記述したものでしょうか?


824:デフォルトの名無しさん
09/04/06 20:34:26
Perl正規表現雑技
URLリンク(www.din.or.jp)

ここにありました。

 (?!)

こんな簡単なのでいいんですね

825:デフォルトの名無しさん
09/04/06 20:52:58
否定先読みで全ての要素を否定してるから、何にもマッチしないって事だね。
良いんでない?

826:デフォルトの名無しさん
09/04/07 14:27:36
/xxx/sss/ccc/fff/ggg/aaa.txt

と言う感じで任意の回数スラッシュが出てくるんですが、一番最後のスラッシュ
だけをsedで "/"→"/tmp/"に置き換えたいんです。

正規表現を使って置換可能でしょうか?記述が全く思いつきません、、、



827:デフォルトの名無しさん
09/04/07 14:53:02
>>826
s/(\/[^/]+)$/\/tmp\1/g

828:デフォルトの名無しさん
09/04/07 14:53:15
>>826
s:/[^/]*$:/tmp&:

829:デフォルトの名無しさん
09/04/07 21:32:38
否定先読みでマッチさせてもいいかもね。

830:デフォルトの名無しさん
09/04/07 22:56:23
というか、一番最後のスラッシュっていう条件はまだ甘い方だと思うんだけど。
全く思いつかないってのは単に勉強不足じゃない?

831:826
09/04/08 00:19:51
>>827-830
色々アドバイスありがとうございます。
828氏の記述で期待通りの処理が出来ました。

>>830
すみません、仰るとおりで。
書いた後色々グググって、IBMのページ

URLリンク(www.ibm.com)

の"円記号付き括弧"を参考にした漏れなりの解↓

's/\(.*\)\/\(.*\)/\1\/tmp\/\2/g'

自分で書いておきながら、何でこれが一番最後のスラッシュにマッチするのか
よく分かってない('A`


832:デフォルトの名無しさん
09/04/08 01:04:48
マッチっていう意味ならスラッシュのある一行全体にマッチしてる。
で、最初の括弧が\1、次の括弧が\2としてマッチ。

というか\2の辺り削ってもいいんじゃないかと。

s/(.*)\//\1\/tmp\//g

833:826
09/04/08 01:26:34
>>832
いや、分からないのは、's/\(.*\)\/\(.*\)/\1\/tmp\/\2/g' この表現で何故

aaa/tmp/bbb/ccc/ddd/eee/fff.txt

とならずに

aaa/bbb/ccc/ddd/eee/tmp/fff.txt

と、一番最後のスラッシュが対象になるのかなぁ、と。


834:デフォルトの名無しさん
09/04/08 01:44:41
bregonig.dllのバグとおもう。デミリタを換えると関数が失敗してる。
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
typedef struct bregexp { const char *outp; const char *outendp; int splitctr; const char **splitp; int rsv1; char *parap; char *paraendp; char *transtblp; char **startp; char **endp; int nparens; } BREGEXP;
typedef int (WINAPI *fa)(char * , char * , char * , BREGEXP ** , char *);
typedef void (WINAPI *fb)(BREGEXP *);

main(){
char bunsyo[26]="abcdefghijklmnopqrstuvwxyz";
char findstr[]={0xA5, 0xEA}, *p, msg[80];

HINSTANCE hd = LoadLibrary("bregonig.dll");
fa BMatch = (fa)GetProcAddress(hd,"BMatch");
fb BRegfree = (fb)GetProcAddress(hd,"BRegfree");

string str = "m/" + (string)findstr + "/i";
char c=47; str[1]=str[28]=c;
{ BREGEXP *rxp = NULL;
if( BMatch( &str[0], bunsyo, bunsyo+26, &rxp, msg) )
{ cout<<"Hit "; p=(rxp->startp[0]); } else cout<<"NoHit ";
BRegfree(rxp); }
cout<<"デミリタ "<< c <<" は通る\n";

c=1; str[1]=str[28]=c;
{ BREGEXP *rxp = NULL;
if( BMatch( &str[0], bunsyo, bunsyo+26, &rxp, msg) )
{ cout<<"Hit "; p=(rxp->startp[0]); } else cout<<"NoHit ";
BRegfree(rxp); }
cout<<"デミリタ "<< c <<" は通る\n";
}

835:834の修正。 これが動作しません
09/04/08 02:11:11
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;

typedef struct bregexp { const char *outp; const char *outendp; int splitctr; const char **splitp; int rsv1; char *parap; char *paraendp; char *transtblp; char **startp; char **endp; int nparens; } BREGEXP;
typedef int (WINAPI *fa)(char * , char * , char * , BREGEXP ** , char *);
typedef void (WINAPI *fb)(BREGEXP *);

main(){
char bunsyo[7]="abcdef/";
char findstr[4]={0x2F, 0xA5, 0xEA, 0}, *p, msg[80];

HINSTANCE hd = LoadLibrary("bregonig.dll");
fa BMatch = (fa)GetProcAddress(hd,"BMatch");
fb BRegfree = (fb)GetProcAddress(hd,"BRegfree");


string str=(string)"m/" + (string)findstr + (string)"/i";

char c='/'; str[1]=str[9]=c;
{ BREGEXP *rxp = NULL;
if( BMatch( &str[0], bunsyo, bunsyo+7, &rxp, msg) ) { cout<<"Hit "; p=(rxp->startp[0]); } else cout<<"NoHit ";
BRegfree(rxp); }
cout<<"デミリタ "<< c <<" は通る\n";

c='*'; str[1]=str[9]=c;
{ BREGEXP *rxp = NULL;
if( BMatch( &str[0], bunsyo, bunsyo+7, &rxp, msg) ) { cout<<"Hit "; p=(rxp->startp[0]); } else cout<<"NoHit ";
BRegfree(rxp); }
cout<<"デミリタ "<< c <<" は通る\n"; }

836:デフォルトの名無しさん
09/04/08 02:14:16
検索しようとする文字列に、特定の文字が含まれている場合、
デミリタを「/」以外にするとバグるようなんです。
しかし、検索しようとする文字に「/」が含まれている場合は別のデミリタを使うしか無く困ります。

837:デフォルトの名無しさん
09/04/08 02:40:05
サクラエディタで検索してもバグらないし、ソースコードみても回避方法わからなかった

838:デフォルトの名無しさん
09/04/08 04:20:23
>>833
最大マッチと最小マッチの差じゃない?
sedは知らんけど

839:836
09/04/08 04:27:12
次の文字でバグりました。
40 41 42 43 63 91 92 129
EUC全角カタカナ「リ」

840:デフォルトの名無しさん
09/04/08 04:39:05
そりゃエスケープせんと。例えばasciiの40って、'('じゃないか。

841:836
09/04/08 05:14:28
特殊文字はわかりました。しかし「リ」を含む文字でも間違えるんです。
検索対象には含まれていないのに、含まれているとなるんです。

842:デフォルトの名無しさん
09/04/08 06:55:23
どう間違えているか判らんが、cp932対応のエンジンにeucを食わせたらそりゃぁ、混同するさ。

843:836
09/04/08 08:09:39
BREGEXPってバイナリの正規表現が出来るとおもってた。
Bは馬場さんのBでバイナリではなかったのか。

844:836
09/04/08 08:16:09
書いてありました。


5.制限事項・注意事項

 Oniguruma 自体は各種文字エンコーディングに対応していますが、
bregonig.dll は Bregexp.dll との互換性のため、ASCII と Shift_JIS 以
外の文字エンコーディングは使用できません。

845:鬼車を弄くった。これで任意の文字でいけるだろうか
09/04/08 10:14:16
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
#include "oniguruma.h"
#pragma comment(lib, "onig.lib")

char *Bfind(char *start,char *end, string ptn, int *size){
int r; regex_t* reg; OnigErrorInfo einfo; char *p=NULL; *size=0;
r = onig_new(®, (UChar*)&ptn[0], (UChar*)&ptn[ptn.size()] ,ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, ONIG_SYNTAX_DEFAULT, &einfo);
if (r != ONIG_NORMAL) return NULL;
OnigRegion *region = onig_region_new();
r = onig_search(reg, (UChar*)start, (UChar*)end, (UChar*)start, (UChar*)end, region, ONIG_OPTION_NONE);
if (r >= 0) { *size=region->end[0]-region->beg[0]; p= start+r; }
onig_region_free(region, 1 ); onig_free(reg); onig_end(); return p; }

char *Bpick(char *start, char *end, string ptn, string &str){
int r; regex_t* reg; OnigErrorInfo einfo; char *p=NULL; str=""; int size;
r = onig_new(®, (UChar*)&ptn[0], (UChar*)&ptn[ptn.size()] ,ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, ONIG_SYNTAX_DEFAULT, &einfo);
if (r != ONIG_NORMAL) return NULL;
OnigRegion *region = onig_region_new();
r = onig_search(reg, (UChar*)start, (UChar*)end, (UChar*)start, (UChar*)end, region, ONIG_OPTION_NONE);
if (r >= 0) {
if(region->num_regs==1){p=start + region->beg[0]; size=(region->end[0]-region->beg[0]); }
else { p=start + region->beg[1]; size=(region->end[1]-region->beg[1]); }
str.resize(size); memcpy(&str[0],p,size) ;}
onig_region_free(region, 1 ); onig_free(reg); onig_end(); return p; }

main(){
char x[]="zzzzaffffffffb"; string s,ptn;
ptn="a.*b"; Bpick(x, x+strlen(x), ptn, s); cout<<s<<endl;
ptn="a(.*)b"; Bpick(x, x+strlen(x), ptn, s); cout<<s<<endl; }

846:デフォルトの名無しさん
09/04/08 10:37:09
845だと多バイト文字は識別しないはずなので、バイナリ文字列の正規表現がいけるはずです。
うちの環境ではEUCの文字でバグっていたところも問題でなくなりました。
Bfindは、ptnを検索して、見つかった先頭アドレスを返します。
Bpickは、正規表現にマッチした文字列をstrにセットします。

847:デフォルトの名無しさん
09/04/08 23:31:24
>>839
>EUC全角カタカナ「リ」
2バイト目は0xEAだから、Shift_JISの1バイト目として解釈されてその次の1バイトが
デリミタとして扱われていない。
そういう変なバイト列を検索したいのなら、\xHH形式を使えば?
findstr="\\x2F\\xA5\\xEA";

848:デフォルトの名無しさん
09/04/09 02:09:32
そういうことか 納得

849:デフォルトの名無しさん
09/04/09 08:10:26
ホスト名を抜き出したいです。例えば、

URLリンク(goo.ne.jp)<)
↓↓↓↓↓↓↓↓↓↓
goo.ne.jp
google.com

としたいです。

850:デフォルトの名無しさん
09/04/09 08:26:40
スレ違いです

851:デフォルトの名無しさん
09/04/09 09:33:07
>>849
URLだかURIのRFCに正規表現がそのまま載ってた覚えがあるぞ。


852:デフォルトの名無しさん
09/04/09 10:00:37
http://([^/]+)
\1
でいいだろ

853:デフォルトの名無しさん
09/04/11 13:51:18
はあ?

854:デフォルトの名無しさん
09/04/11 14:28:59
h?http://([^/]+).* \r

$1 \r

855:デフォルトの名無しさん
09/04/11 14:31:31
>>849
“ホスト名”の定義があいまい
トップページへのアクセス先を取りたいということの場合に
sub.example.jpに対してトップはexample.jpではなくmain.example.jpだったら?

FQDNを抜き出すということなら自分はこうする
([^:/]+)(?=\/)

856:855
09/04/11 14:33:51
先頭に://と@の扱い入れるの忘れたや

857:デフォルトの名無しさん
09/04/11 23:42:47
ポートの事も、たまには思い出してください。

858:デフォルトの名無しさん
09/04/12 05:52:12
法令の条文の漢数字を算用数字に置換する正規表現を教えてください。

たとえば、

第一条    → 第1条

第十一条   → 第11条

第三十四条  → 第34条

第百条    → 第100条

第百二十三条 → 第123条

第三百二条  → 第302条

第千三条   → 第1003条

第千二十三条 → 第1023条

等です。ついでに、

第二百五十六条の二   → 第256条の2

第二百五十六条の二の一 → 第256条の2の1

なんかも置換できれば大変うれしいです

よろしくお願いします。


859:デフォルトの名無しさん
09/04/12 07:57:41
そりゃ正規表現だけじゃ無理だべ。
なんらかの言語の支援がないと。

860:デフォルトの名無しさん
09/04/12 09:33:59
「なんば君」HELP で検索。

861:デフォルトの名無しさん
09/04/12 12:40:41
なんで正規表現でやりたがるのか理解できない

862:デフォルトの名無しさん
09/04/13 00:18:11
魔法の呪文
正規表現

863:デフォルトの名無しさん
09/04/13 02:00:53
>>861 「なんで」うんぬん

たとえば、テキスト・ファイル中に

「まったく正規表現とは関係ないが、民事訴訟法第123条第2項は美しい!」

とかあった場合に、その行にカーソルをおいて特定のキーを押せば、
民事訴訟法第123条第2項の条文がポップ・アップで表示できるEmEditorの(Javascriptもどきの)
マクロを作って使用しているのですが、模範六法のCD等から落としたファイルの条文は
算用数字なのに、Webページで公開されている条文のなかには漢数字のものが多いので、
それを利用したいな、なんて思ったたわけです。

貴兄たちの異常な才能を信じてお願いしてみました。






864:デフォルトの名無しさん
09/04/13 02:06:18
そういう意味の「なんで」じゃ無いやろw

865:デフォルトの名無しさん
09/04/13 02:07:07
>>863
それは貴方の求める機能の目的であって、
そこに正規表現を使う理由にはならないでしょう?
およそ正規表現が引き合いに出されるような要求では無いように思いますが。

866:デフォルトの名無しさん
09/04/13 02:27:08
>>865

私が作ったマクロが正規表現で条項の検索をしているので、
そこのところを置き換えるだけですめばわたしにとって便利だ
という、たんなる自己中理由でした。

みなさんに不愉快な思いをさせたみたいですみません。



867:デフォルトの名無しさん
09/04/13 04:36:09
だから、何故正規表現云々の前に自分の環境を提示しないの? 馬鹿なの? 日本語学習中なの?

868:デフォルトの名無しさん
09/04/13 06:03:19
第三者だが、>>867は分かりにくいぞ。
>>863にEmEditorのマクロでと記載してあるが。

869:デフォルトの名無しさん
09/04/13 09:09:22
EmEditorのことは全然わからないけど
その Javascriptもどき ってヤツでプログラミングすればいいんじゃないの?

こんなのがあるけど参考になるかな・・・
URLリンク(d.hatena.ne.jp)

870:デフォルトの名無しさん
09/04/13 09:11:53
おっと、Javascript 版みっけ!
URLリンク(blog.livedoor.jp)

871:デフォルトの名無しさん
09/04/13 09:14:41
ついでに Excel
URLリンク(www.windows-world.jp)

872:デフォルトの名無しさん
09/04/13 22:44:12
●正規表現の使用環境
Flexible Renamer(Perl5互換)

●検索か置換か?
置換

●説明

サクラエディタでNCプログラムの編集をしています
可能かどうかわかりませんが以下のような形式で
Nの後の番号を振り直すというのはできるでしょうか?


●対象データ
N10 ABC
N10 DEF
N30 GHI
N100 JKL
N50 MNO

●希望する結果

N10 ABC
N20 DEF
N30 GHI
N40 JKL
N50 MNO

873:デフォルトの名無しさん
09/04/13 23:08:53
そういうのは正規表現の仕事ではありません

874:872
09/04/13 23:22:10
>>873
了解です、できないと事がわかったので感謝します

875:デフォルトの名無しさん
09/04/14 01:36:46
たしかに
....replace(/^N\d+/, "N" + n); n += 10;
のようにやるよりは
{ $1 = "N" (10 * NR); print }
の感じのほうがいいな。

876:taguti
09/04/14 14:41:40
6個のreal型変数x1、y1、x2、y2、x3、y3を定義しそれぞれに実数つを読み込んで、xy平面上の3点
(x1、y1)(x2、y2)(x3、y3)を頂点に持つ三角形の面積を計算して、その値を表示するプログラムを作成してください。
・公式:底辺x高さ÷2を使って計算してください。
お願いします!!



877:デフォルトの名無しさん
09/04/14 14:47:38
それを正規表現でやるのか

878:デフォルトの名無しさん
09/04/14 16:15:56
包茎が治る正規表現を教えてください。
先っぽの皮が余ってしょうがないんです。
お願いします!!

879:デフォルトの名無しさん
09/04/14 22:41:17
>>876
これはひどいwww
ここまで来ると逆に尊敬するマルチ野郎だな。
スレリンク(tech板:493番)
スレリンク(tech板:770番)
スレリンク(tech板:499番)
スレリンク(tech板:774番)
スレリンク(tech板:876番)
スレリンク(tech板:66番)
スレリンク(tech板:499番)
スレリンク(tech板:808番)
スレリンク(tech板:821番)
スレリンク(tech板:16番)
スレリンク(tech板:934番)
良識を疑うよ。


880:デフォルトの名無しさん
09/04/14 22:54:02
>>879
すれ違いだけど
俺もそれ学校の問題で出されたことある。
定番かな。構造体使うC言語の問題で。
はっきりいって、三角形の公式使わないほうが楽だよね。
一点を原点移動して例の公式を適用するのが一番シンプルだと思う。

881:デフォルトの名無しさん
09/04/15 18:25:02
>>876
ヘロンの定理でググれカス。

882:デフォルトの名無しさん
09/04/15 20:12:01
>>881
不覚にも

883:デフォルトの名無しさん
09/04/16 00:50:48
何と戦ってるんだろう

884:デフォルトの名無しさん
09/04/16 12:31:02
>>879
そんな事より
答え書けよ!

885:デフォルトの名無しさん
09/04/16 13:25:44
>>881
ヘロンの定理
イラナイだろ
とんち問題だよ

886:デフォルトの名無しさん
09/04/16 13:39:16
>>880 >>881
ヘロンの定理で良いから
プロ書いてみたら


887:デフォルトの名無しさん
09/04/16 13:58:24
いや、どう考えてもプログラミングしてくれってのがおかしいだろ。
正規表現のスレで出る話題じゃない。

888:デフォルトの名無しさん
09/04/16 14:04:39
#include <stdio.h>
#include <math.h>
int main(void)
{
double x1, y1, x2, y2, x3, y3;
double a, b, c, s, S;
#define INPUT(x) printf(#x ": "); scanf("%lf", &x)
INPUT(x1); INPUT(y1);
INPUT(x2); INPUT(y2);
INPUT(x3); INPUT(y3);
a = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
b = sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2));
c = sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3));
s = (a + b + c) / 2.0;
S = sqrt(s * (s - a) * (s - b) * (s - c));
printf("三角形の面積は %lg\n", S);
return 0;
}

889:デフォルトの名無しさん
09/04/16 19:48:18
ヘロンの公式キターーー

890:デフォルトの名無しさん
09/04/16 20:06:18
>>888
こういう一見親切そうな行動をする人間が、世の中のすべてを駄目にする。

891:デフォルトの名無しさん
09/04/16 20:26:15
ヘロンの公式とかこの問題を解くのにふさわしくない

892:デフォルトの名無しさん
09/04/16 20:36:33
>>891
照合するのに使う

893:デフォルトの名無しさん
09/04/16 20:38:14
>>890
お舞いも
書いてみたら

894:デフォルトの名無しさん
09/04/16 20:56:34
性器表現できません><

895:デフォルトの名無しさん
09/04/16 21:54:39
行列式でも出るよ
さあ誰か書け

896:デフォルトの名無しさん
09/04/16 22:04:04
↑お麻衣が書くニダ

897:デフォルトの名無しさん
09/04/16 22:17:53
>>876
>それぞれに実数つを読み込んで

ココ
とても難しい
どこから?
どうやって?

それで
乱数で与えてみる

898:デフォルトの名無しさん
09/04/16 22:44:34
ヘロン公式は
√を使うから
誤差はどう?

899:デフォルトの名無しさん
09/04/16 22:49:03
JavaScriptが動く HTML実験部屋
URLリンク(homepage2.nifty.com)


900:デフォルトの名無しさん
09/04/16 23:01:38
<center><script> var x1, y1, x2, y2, x3, y3; var a, b, c, s, S; var S1,S2,M,N;
/*倍率*/ M=100000000;
/*回数*/ N=1000;
document.write('<style>td,th{font-size:10;}</style><table border=1><tr>');
document.write('<th>x1</th><th>y1</th><th>x2</th><th>y2</th><th>x3</th><th>y3</th>');
document.write('<th>底辺x高さ÷2公式<br>による面積計算結果</th>');
document.write('<th>ヘロン公式による<br>√を使った面積計算結果</th>');
document.write('<th>問題となる誤差<br>倍率'+M+'倍</th></tr>');

for(i=0;N>i;i++){ // 数値を自動代入
x1=(Math.random()*2-1)*M; y1=(Math.random()*2-1)*M;
x2=(Math.random()*2-1)*M; y2=(Math.random()*2-1)*M;
x3=(Math.random()*2-1)*M; y3=(Math.random()*2-1)*M;

a=Math.abs(x1-x2)*Math.abs(y1-y2)/2; // 底辺x高さ÷2公式による面積の計算
b=Math.abs(x2-x3)*Math.abs(y2-y3)/2;
c=Math.abs(x3-x1)*Math.abs(y3-y1)/2;
s=(Math.max(Math.max(x1,x2),x3)-Math.min(Math.min(x1,x2),x3))
s*=(Math.max(Math.max(y1,y2),y3)-Math.min(Math.min(y1,y2),y3)); S=s-a-b-c; S1=S;

a = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); // ヘロン公式による√を使った面積の計算
b = Math.sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2));
c = Math.sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3));
s = (a + b + c) / 2.0; S = Math.sqrt(s * (s - a) * (s - b) * (s - c)); S2=S;

document.write('<tr><td> '+x1+'</td><td> '+y1+'</td>'); // 計算結果と誤差を表示
document.write('<td> '+x2+'</td><td> '+y2+'</td><td> '+x3+'</td><td> '+y3+'</td>');
document.write('<td> '+S1+'</td><td> '+S2+'</td><td> '+(S1-S2)+'</td></tr>');
}document.write('</table>');
</script>


901:デフォルトの名無しさん
09/04/16 23:02:20
>>888 >>900>>899


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch