[|:;, ]{2}[|!:;.,\] [\∧∨ヮ] ([w]{5}|[w]{3}) これを一行にまとめるとどういう書き方ができるでしょうか?
([|:;, ]{2}[|!:;.,\∧∨ヮ]|[w]{5}|[w]{3})
スルーされにくい質問のテンプレと例 ●正規表現の使用環境 Java1.5 ●検索か置換か? 検索 ●説明 各行の1番目のAまでを検索したい ●対象データ ABCA BCAA CABA ●希望する結果 ABCA ^ BCAA ^^^ CABA ^^
根性の悪い捻くれた奴が減れば無問題
7 :
デフォルトの名無しさん :2008/06/05(木) 20:10:15
このスレの過去ログ集はないんですか?
9 :
7 :2008/06/06(金) 00:18:32
>>8 ありがとうございます。全部DAT落ちしています。
どこかにHTML化されたものがUPされていませんか?
11 :
デフォルトの名無しさん :2008/06/07(土) 01:24:25
ダブルコーテーションで囲まれた部分を検索したいのですが、 囲まれた部分が複数あると全部をまとめて見つけてしまいます。 最初のひとつだけを対象にするにはどう書けば良いでしょうか? data="あいうえお" name="かきくけこ" このような文字列の中から あいうえお だけを検索したいです。 現在は reg = New Regex("data=""(?<DATA>.+)""", RegexOptions.Compiled) というようにしてあります。 これだと、 str = reg.Match(pagedata).Result("${DATA}") での取得結果が あいうえお" name="かきくけこ" になってしまいます。 VB.NETなのですが、宜しくお願いします。
>>11 reg = New Regex("data=""(?<DATA>.+?)""", RegexOptions.Compiled)
>>12 すごい!出来ました
ありがとう
色々調べたのに全然違ってた^ー^;)
"""と3つ続けて書くときもあるんだなぁ あぼーん対象になってた
"foo\"bar"@baz.com ローカルパートの前後の"だけを除去したいのですがどう書けば良いのでしょうか preg_replace('/[^\\\]"/', '', $str); では最初の"が除去されませんでした
/^"|"@/ でいいのでは。 メールアドレスに「\で"をエスケープ」なんて仕様あったっけ?
おとなしく@で分割して前後削っときなさい
18 :
15 :2008/06/12(木) 14:16:47
>16 ローカルパートでスペースや","といった文字を使う場合はダブルクォートで括る必要があるみたいです。 受信したメールで希にそういうものがありました。 >17 おとなしくそんな対応にしましたどうもです
>>18 「""で括る」というのはその通りなんだけど、その括られた中で \" と
いう記述のルールはあるの、ということ。
>19
http://www003.upp.so-net.ne.jp/hat/imail/sec08.html >もっと面倒なのは、ユーザ名に「"」や「\」が入っている場合です。
>このときは「""」で括っただけではダメだという決まりがあるので、直前に「\」を付けます。
>次は、ユーザ名が「urashima"taro」の場合と、「urashima\taro」の場合です。
To: "urashima\"taro"@example.com
To: "urashima\\taro"@example.com
だそうです。
"\""は許されるが、"\\"は許されない
>>20 ほんとだ、確認してみたらちゃんとそういうルールがあったね。騒がせてごめん。
24 :
デフォルトの名無しさん :2008/06/16(月) 20:51:15
すみません。
sakuraエディタをインストールして
<A href="
http://www.xxx.com/ " target="_blank">ABC</A>
を
<A href="
http://www.xxx.com/ " target="_blank"
title="
http://www.xxx.com/ ">ABC</A>
に置き換える方法を探してるんですけど、別所で
・検索文字列に「<(a|A) ([^>]*)href="([^"]+)"」、置換文字列に「<$1 $2href="$3" title="$3"」と入れる
・置換する。
といわれたのを参考に色々試したんですが、全くの無知なもので、ぜんぜん置き換えできないので、
よければ詳しく教えてください。
テキスト内全部置き換えじゃなくて、通常の置き換えみたいに下方向とか指定できれば助かるんですが、
無理ならHTMLから部分的に切り取ってやってみます。
正規表現はそれで機能する。実際にsakuraエディタで試した あとはsakuraエディタの問題だからこれ以上はスレ違い
href="([^"]+)" href="$1" title="$1" めんどくさいし、これでいいよ
すみません。チェックいれたらできました・・・・ 失礼しました。
ついでに聞きたいんですけど、、 URLにある文字列 たとえば www.abcd などのドメイン名が含まれる場合のみ置き換えて、他のドメインは一切触らないってコマンドも可能ですか? www.abcd.aa www.abcd.ab とwww.abcdが含まれる物は当然全部置き換えるようにしたいんですけど……
href="www\.abcd.*?"
30 :
28 :2008/06/19(木) 07:51:48
ここまでくると、エディタの置換一発って訳にはいかないだろう。 perlとかrubyとか、正規表現とテキストの扱いに長けたスクリプト言語を使うとか、 エディタの置換でも、一発で全て解決しようとせずに 多段階で置換するとか、目的の物を他と区別出来る一旦違う形に変換するとか、 そういう工夫が要る。 個人的には、数が多くて今後もまたやる作業なら、何らかの言語を使う。
出来ないことはないだろうけど、タグが厄介なんだよな。 正規表現マッチングする前にHTMLパーサーとか使って処理したい。
パズル的な楽しさを追求するならいいけど、 実用だったら早々に見切りを付けるのも肝心だよね。 複雑な正規表現は、後で手直しするのも面倒だし。
34 :
30 :2008/06/19(木) 11:32:57
36 :
34 :2008/06/19(木) 12:35:03
こんなに複雑なこと頼んでたんですか…… 置き換えで出来ると思ったけど甘かったんですね。 使い方調べてやってみます。 ありがとう御座いました。
37 :
34 :2008/06/19(木) 12:58:55
えーと pythonのスクリプトだから、pythonがインストールされていなければダメだよ foo.pyという名前で保存したとすると python foo.py <hoge.html のようにして標準入力から食わせてやるとよい
anchor以外の任意のインライン要素が anchorの子要素になり得るので注意
なぜPerlを…Pythonってwindows用のバイナリないの?
ActivePythonというのがあるし 自分でコンパイルもできるよ
同じとこにあるよ。ActivePython
あのー全く無知なもんで、scriptと言えばwebのjavascriptと cgiscriptしか分からないのですが、 やりたいのは、sakuraエディタで今開いてるabc.txtの置き換えです。 35サンと39さんが同じ人かは分かりませんが、39さんの手法が分かりやすそうなんで、 別の人だったら35さんには悪いですが、pealって書いてあるから 必要だと思ってインストールしてみたんですが、動かし方がよく分かりません。;;
あ、あったんで、今ActivePython落としてます。
wxPython2.8-win32-unicode-2.8.7.1-py25.exe を落としてインストールしました。 前にBlender弄ったときに入れた気もしますが。
Python Shellを起動してabc.txtを開いてみたんですが、これにどうにかしてupしてもらったtxtの内容を使えばいいのかな?
ここは君の作業ログじゃないから、 試行錯誤して困ったらまたおいで。
50 :
48 :2008/06/19(木) 18:41:53
最終的に python234jp-20040927 をインストールして、helpファイルずっと見てるんですが、さっぱり理解できません;; pythonについては別板で聞いたほうがいいんですかね?
51 :
39 :2008/06/19(木) 19:14:10
# unko.pl
# ActivePerl で動作確認済
# つかいかた...コマンドプロンプトで C> unko.pl abc.txt
open FILE, '<', $ARGV[0];
read FILE, $htm, -s FILE;
close FILE;
$htm =~ s/<(a href=)"(
http:\/\/www.xxx.com\/[^ "]+)"([^>]*)>(.*?)(<\/a>)/<$1$2$3 title="$4 $2">$4$5/ig;
print $htm;
やっぱり別の人だったんですね。 とりあえず、>51の4行目以下をテキストにコピーして、unko.plで保存。 cmd.exeと同じディレクトリにabc.txtとunko.plをおいて試しましたが、駄目でした。 処理が始まって、終わったあとabc.txt見ても内容変化してないです。 原因は、www.xxx.com/abc.def?ghi=xyz.とかになってるとして、?とか=の文字が原因になってるとかありませんか? それか、_blank">ここが日本語になってる</a>のが原因とか・・・ pythonのほうも弄ってますが、まだわかりません。
JScript 5.6(WSH)で行先頭の数式を検索したいのですが、 単体の数字や何故か英単語まで反応してしまって困っています。 要するに数値といずれかの演算子を含むパターンが組めればよいのですが、正規表現に馴れておらずうまくいきません。 問題なく検索可能なパターンを教えていただけないでしょうか? 「50+2*2 付随テキスト」にはマッチする。 「50 付随テキスト」にはマッチしない。 現在問題の出ているパターン new RegExp("^([\d\+\-d\*\/\(\)r@]+)[ | ]*(.*)", "i") //d, r, z ,@は演算子としてそれ以降の処理で使用しています
>>53 とりあえずヒントとしては、
●JavaScriptの文字列定数内では \ がエスケープ文字
●[演算子じゃない文字]([演算子][演算子じゃない文字])+
●[演算子じゃない文字]+([演算子][演算子じゃない文字]+)+ に訂正。 厳密じゃないけどね。
56 :
53 :2008/06/20(金) 00:23:42
>>54 うまくいきました。ありがとうございます。
>>52 おまえなぁ、要求をコロコロ変えるなよ。
あとからあとからチビチビ仕様を変更せずに、最初にキッチリ書いとけよ。
>>52 わかったかった。「置き換える」の意味が、やっとわかったよ。
ここは正規表現スレなんで、置換の事だと勘違いしてた。
unko.pl は画面に表示するだけだ。
置き換えしたければ abc.txt を open して print 文で $htm を書き出せ。
入力が決まらないのに正規表現を書くなんて徒労もいいとこだお
51で問題ありませんでした。 私のやり方が間違ってたようです。 お二人には感謝してます。 プログラムの面白さが分かったような気がするので、これを機に少しずつ勉強初めてみます。 最初はやっぱりcgiとかがいいんでしょうか? web関係で役立つスキルが欲しいのですが・・・・
>>60 お手軽さならJavaScriptかな。
ローカルでも実行可能だし、正規表現も扱えるし、ページを動的加工して遊べるし。
都道府県名からの住所を一行で入力する **県※※郡○○市●●-●● この文字列を 都道府県名、郡名、市区町村名、その他に分けるときの正規表現はどうしたらいいのでしょう? ※「村山市」や「四日市市」など市区町村名に「市区町村」の四文字が入ったものは考えないものとします。 言語はPHPです。
PHPの文法は知らないけど、単純に考えると /([^県]+県)([^郡]+郡)([^市]+市)(.*)/で、$1〜$4かなぁ。 郡って必ず付くのかな。
/([^県]+県|[^道]+道|[^府]+府)([^郡]+郡|[^市]+市)(.*)/ の方が良くないかな。
明治以降、郡に属している市はない
書き込ませて頂きます。 Adobe Goliveの置換機能で、正規表現の奥深さを 知りました。 <!-- start --> <div class="menu"> <ul> <li></li> <li></li> <li></li> </ul> </div> <!-- end --> これの<!-- start -->から<!-- end -->までを選択したいとき、 <!-- start -->\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*<!-- end -->とすると 選択はできました。 しかし\nや.*がたくさん出てきてしまい、困っています。 もう少し簡素化できないでしょうか? ご教授お願いします。<(__)>
Goliveさんの仕様は知らんけど、.が改行を含まない仕様なのかな? <!-- start -->(\n|.)*<!-- end --> こんな感じ?
>>67 mオプションとか
マルチラインモードとか
そういう機能はない?
70 :
67 :2008/06/24(火) 06:16:41
>>68 さん
まさしくそれです!検証したところバッチリ動作しました。
これで管理が楽になると思います。
ありがとうございます(^^)
>>69 さん
mオプション、マルチラインモード等の語句でググってきました。
残念ながら今の自分の頭では理解しきれず、その機能があるかどうか不明
です...(ノД`)・゜・。ゴメンナサイ,モット勉強シテキマス
また行き詰まったとき、来させて頂きます。
教えて頂いた方々、本当にありがとうございました。
正規表現ほとんど触ったことなかったんですが、 1文字以上で特定の文字(チェックしたいのは [ と ] )を含まないってどう書くんでしょうか?
>>71 >>2 に書いてあるよ。それ読んでもわからなかったら、また質問しにおいで。
73 :
71 :2008/06/27(金) 15:05:09
なかなか難しい。 C#で試しに'A'がある文字列をはじくように書いてみましたがうまく 動きませんでした。 string pat = @"^(?!A)*$"; bool result; result = Regex.IsMatch( "あいうえお", pat ); result = Regex.IsMatch( "あいうAえお", pat ); pat を @"^[^A]*$" にしてみたらうまく動いたけど、なんで最初の条件で動かないんでしょうか・・。
> string pat = @"^(?!A)*$"; .netの正規表現には詳しくないんだけど、一般的な解釈で考えるとこれ はパターンの文法エラーになってもおかしくないよ。ふつうは先読みや 後読みに繰り返し(+ * {n,m})は付けられない。先読みや後読みは文字を 消費しないので、繰り返しても意味がない。
なるほど。使えない組合せもあるのか〜。 ありがとう。
これとほぼ同じ性能のやつを作りたいのですが、どんな言語と知識が必要ですか?
当方はhtmlまでしか理解できてません。
スタイルシートの理解度は10%程度です。
たまに、メモ帳の置き換えで正規表現を使うぐらいです。
ttp://www.ahref.org/cgi/urlchu/ 多少アレンジするつもりですが、最低限必要なことが知りたいです。
* HTML。特にフォーム * CGIの基礎。フォームから受け取った入力にどうやってアクセスするか * スクリプト言語。Perl, PHP, Python, Rubyのうち好きなのをどれか あとはHTMLからリンクを抽出する方法でぐぐれば 各スクリプト言語用のサンプルがいくらでも出てくるからそれを使えばOK これ以降は正規表現云々よりCGIの話だからそっちいって聞いておいで
Javascriptだけで十分じゃ?
79 :
77 :2008/06/29(日) 23:16:42
あ、その通りだ。ごめんね
80 :
デフォルトの名無しさん :2008/07/01(火) 00:04:06
「アルファベット {a,b,c} 上で a の数が偶数の文字列を表す正規表現」を書 きたいんですが、状態が 8 つ、受理状態が 4 つの状態遷移図は書けるものの、 これをどうやって正規表現に落とせばいいかわかりません。。。 状態遷移図を正規表現にするときのコツみたいのってありますか?
/([^a]*a[^a]*a[^a]*)*/
82 :
デフォルトの名無しさん :2008/07/01(火) 05:16:53
10-20など、正数-正数という入力をし ある文字列に10〜20などが入っていた場合にはその文字列を表示しようとしているのですが 自分ではスマートなやり方が思いつかなかったので まず数字-数字に対して([0-9]{1,2})-([0-9]{1,2})とヒットさせ 前括弧をprematch 後括弧をaftmatchとして for(int i=prematch; i<=aftmatch;i++) と回して 10|11|12|...|20 と力技で置換し それを文字列に対して正規表現でマッチさせています 何か良いスマートな方法はありませんか。
なんでなんでも正規表現を使いたがるの? /\d+/抜き出して[10,20]かどうか判断すればいいじゃん。
>>84 なるほど
検索文字列をどうにかするのではなく
被検索文字列から数字のみを抜き出せばいいんですね
その方法を少し変え別の部分にも適応すると
その部分も解決しそうです
ありがとうございました
#[xx,yy]という表現を知らなかったから勉強し直そう…
>>83 中身に関係ないけど、
pre <-> post
before <-> after
じゃないのか。
>>86 postなんて表現があったんですね
直しました、有難うございます
88 :
デフォルトの名無しさん :2008/07/08(火) 22:40:23
//A //BBBB //C //DD //E //FF //G //H //I //J 上のデータで以下の塊で取り出したいのですが //A //BBBB //C //DD //E //FF //G //H //I //J どのような表現をとればよいでしょうか 環境はjavaです
89 :
88 :2008/07/08(火) 22:45:31
>>88です 自己解決しました。
前まで動いていたコードが正しい動作をしなくなったので 相談させて下さい。 \d{2}.\d{2}.\d{2} で、年.月.日の一番新しいファイルを取ってきていたのですが 何故か2月分のファイルを取ってくる様になりました。 1月〜今月までのファイルは有るのですが、コードを打ち込みなおしても 直りませんでした。 対処法などが有ればご教授ください。
>>90 抽出元のフォーマットはどんな感じになってるんだ
>>91 レス有難う御座います。
hoge08.01.01.xls 〜 hoge08.07.13.xlsと言う感じなのですが
何か心当たりは有りますでしょうか?
その二月分のファイル名と \d{2}.\d{2}.\d{2} はマッチするかとか試してみた? とりあえず . はドットそのものじゃなくて任意の一文字を表す ドットそのものは \. ね
>>93 早いレス助かります。
hoge08.02.14.xls辺りを優先でマッチしてしまう様だったので
\d{2}.07.\d{2}に変更すると、今月内の最新のを優先で当たります。
>\.についても気になったので、直したのですが動作的には
変りませんでした。
それは正規表現の問題じゃないと思うよ
>>96 何か正規表現で一番最優先でマッチしてくるものとかが有るのかな?
と思ってみたのですが、以前は正常に稼動していたので
サーバで異常な動作なのかな・・・。
大変有難う御座いました。
>>97 技術屋なら
擬似的にでも似たような環境を作ってテストしてみるのがいい
>>97 正規表現がやるのは「マッチ擦る/しない」だけで、
優先順位とかは検索処理側かと。
\d{2}.\d{2}.\d{2} を誰かがいじったか何かで \d{2}.\d2.\d{2} こうなってしまってるとか???
単に、ディレクトリ内でのファイル配置が変わっただけじゃないのか? 例えば、今までは単純増加だったところに何らかの理由で2月のデータを更新して配置が変わってしまったとか。 いずれにしても、検索処理側の問題だな。
すいません、ある条件にマッチした書き込みとそのレスのみを抽出できる正規表現を 探しているのですが、可能でしょうか?よろしくお願いします。
janeを使用しております。 「12345」や「67890」の様に5桁の数字を含む書き込みとそれに関連するレスを表示したい、 と言うわけです。レス抽出オプションの関連レスを含めるを使用しない形でと思いましたのでよろしくお願いします。
素朴な疑問だが、janeのレス抽出って正規表現使えたか? つーか、janeと言われても派生が多くてどれのことだか判らんが。
何度もすいません。JaneDoeViewを使っています。 ちなみに他の正規表現は使用できています。
janeDoeViewは知らんが、[0-9][0-9][0-9][0-9][0-9]じゃいかんの?
>>107 ありがとうございます。でもそれだと5桁の数字の書かれている書き込みのみの表示となってしまい
それに関連するレスが表示できないところで悩んでいます…
それはJane側が対応してないとどうしようもないのでは。
やっぱりそうですか。何度も有難うございました。
週末の奴といい、janeの奴といい、正規表現を魔法か何かと勘違いしているんじゃないか?
追い討ちをかけるようだが そもそもViewスレで質問する内容だと思うんだが 一つ前のレスで>5へのリンクが貼ってあるにも関わらず読まずに 使用環境書かないし
正規表現は呪いであって魔法ではないの。
>>99-101 返信有難う御座います。
正規表現部分のソースコードは睨めっこしても問題無さそう
なので、なんだか不明です。
いちご2008.01.01〜
みかん2008.01.01〜
みたいに取得するファイルは沢山有って、例えばいちごだけが
2月のファイルを取ってくるって動作になっちゃってます。
ディレクトリやファイルネームの間違えも確認しましたが・・・orz
とりあえず、\d{2}.07.\d{2}の回避方法で運用でカバーすることにしました。
サーバは怖くてリブート出来ないので・・・。有難う御座いました!
>>114 正規表現とヒットする順序には何ら関連がないことは理解できたの?
すいません、渋谷駅前を歩いている通行人で処女の女性のみを抽出したいんですが そういう事って可能でしょうか?よろしくお願いします。
>>116 どう見ても小学生くらいに見えるのなら、先ず大丈夫でしょう。
>>117 取りこぼしがあっちゃいけないと思うが…
>>118 それでは先ず、「処女」の定義をはっきりさせてください。
定義がはっきりしたら、対処してご覧に入れます。
週刊宝石かよ。
(?<!非)処女
{{ABC}}こんちわ{{XYZ}} これの{{ABC}}と{{XYZ}}にマッチさせる表現を教えて下さい。 {{.*}}だと全体がマッチしちゃって・・・お願いします。
おまいの正規表現エンジンの非欲張り型マッチについて調べれ
{{{ABC}}} の場合はどこまでマッチしたいんだろうとか思うが、 とりあえず {{[^}]*}} でもいいかもねー。
125 :
122 :2008/07/17(木) 19:10:27
>>123 ヒントありがとうございます。
>>124 おおっ!
秀丸の強調表示で使おうと思ってました。
で、自分なりに
{{[a-z^A-Z^0-9^ ^$^/^=^+^%^#^\-^_^!^.^,^&^\(^\)^;^:^\"^\'^\?^亜-K^ァ-ヶ^ぁ-ん^0-9^a-z^A-Z^`]*}}
とかやったらよさげだったんですが、
>>124 でおkですね
本当にありがとうございました。
亜-K ってどういう範囲だっけ? SJIS?
Windows-31Jかな。黒の旧字もあるし。 Unicodeだと破綻しちゃうな。 [:alpha:]みたいな感じで、仮名や漢字を指定する構文があればイイのに。
16区から92区までの漢字のようだね
>>128 Unicodeだと、その範囲の漢字はCJK UNIFIED IDEOGRAPHと
CJK COMPATIBILITY IDEOGRAPHに入るんで、Unicodeのカテゴリやブロック名に
対応している正規表現エンジンなら、それを使うのが普通だと思う
そうでないなら、直接コードポイントを用いてU+4E00-U+9FBFとU+F900-U+FAFFで
指定すればいいんじゃないかな
Javaだと [\p{InCJKUnifiedIdeographs}\p{InCJKCompatibilityIdeographs}] XML Schemaだと [\p{IsCJKUnifiedIdeographs}\p{IsCJKCompatibilityIdeographs}] かな。
CGIの正規表現で(月)など()の中に曜日があって 曜日を消したかったので $date =~ s/\([月火水木金土日]\)//g; というのでやってみたんですができなかったんですが どうすればいいでしょうか
use encoding
すみませんsjisです
>>133 おそらく perl スレで聞いたほうがいい質問だな。
ありがとうございます perlスレで質問してきます
教えてください。テレビ番組の検索で「体操」の番組をすべて検索したいのですが、 そのうち「テレビ体操」「みんなの体操。」を除外するにはどのように書けばいいでしょうか?
含む含まないじゃなくて、完全に一致するのを除外? ^((?!^テレビ体操$|^みんなの体操。$).)*体操.*$ こうかなあ・・・
環境によっては、最初の括弧のあとに ?# が必要かも
おっと、?: ね
(11:22) このような括弧になっている文字はどうやって指定したらいいんでしょうか? \([0-9]{1,2}:[0-9]{1,2}\) こんな感じで試してみたんですがうまくいきませんでした・・・。
>>142 「(」とマッチさせたいときに「(」と書くか「\(」と書くか「\\(」と書
くかは環境依存なんだ。というわけで
>>1 を読んで。
半角スペースを指定する方法ってありませんか?
/ /
147 :
デフォルトの名無しさん :2008/07/24(木) 09:50:39
>>145 / /
これってどういう指定法なんでしょうか?
それでわからんのなら、なおさら自分の環境書けよ
149 :
デフォルトの名無しさん :2008/07/24(木) 10:03:51
ごめんなさい、一から勉強してきます
一からじゃねぇよ、零から始めろ。
(abc) → abc ([abc]) → abc [abc(def)hij] → abc(def)hij [abc(d[ef])hij] → abc(d[ef])hij としたいが、 (ab)(cd) → (ab)(cd) のまま。 ab)(cd にはしたくない。 ([abc)] → ([abc)] のまま。abc にはしたくない。 つまり、「文字列両端にあるかっこが、互いに対応する開き・閉じで限りは削除したい」というとき、 perl 5.8.8 の正規表現で書けますか ?
(abc) → abc ([abc]) → a-c [abc(def)hij] → a-f or h-j or ( or ) [abc(d[ef])hij] → a-f or h-j or ( or ) or [ or ] (ab)(cd) → (ab)(cd) ([abc)] → 構文エラー (\[abc)]なら動く
ああ紛らわしくてすみません、(abc) などは、正規表現ではなく、処理対象の文字列です。 (abc) → abc は、(abc) が入ったとき、それを abc に置換したい、という意味です。 【文字列】 → 文字列 【文字列A】と【文字列B】 → (置換しないでそのまま) 《簡単な【文字列】》 → 簡単な【文字列】 【入れ子の《文字列の【中身】は》そのまま】→入れ子の《文字列の【中身】は》そのまま 【またいでいる《かっこは】そのまま》 →(置換しないでそのまま) という置換をしたいのです。
一番上は\((abc)\)だな やりたいことは分かったんだが俺には分からないから賢者に任せる 基本外側にある括弧は取り除く 例外として括弧が並んでる or 括弧が入れ子になってる場合は括弧を取り除かない という感じか
>>151 pattern code expression (??{ expr }) を使えば再帰的な正規表現を書くことが出来る。
性器表現で痴漢
既出
毎日毎日、暑い。暑い。暑い。暑い。 物価高で肉が食えないからスタミナ無い。 エアコン代もバカにならない。 しかもCPUは温風を吐き出しまくる! 暑い。あ゛〜〜〜っ!もう我慢ならん! 正規表現でなんとかなりませんかねぇ
htmlソースからcharsetの値(UTF-8とか)を取り出すスマートな正規表現は どんなものがありますか?
/\bcharset\s*=\s*("|'|)(.*?)\1/i
/w{4,}|(っ|ぇ)うぇ/ /うは(w|w){2,}|おk(w|w){2,}/ これに類する内容をマッチさせるのにもっとスマートな方法はないものか。。
うは[ww]{2,}じゃダメですか
無限ループになってしまうような正規表現て書けるんですかね?
書けても、それを解釈するエンジン側で、よきにはからう。 っつーか /.*/ でも無限ループとは言える。 循環参照?
166 :
デフォルトの名無しさん :2008/08/24(日) 05:38:57
/(!|[ww]|…)/iでNG
文字列の前後の半角/全角スペースを除去したいのですが、 後ろの部分がうまく除去されません。 ^([ ]*)(.*)([ ]*)$ どのようにすればうまく行きますか?
真ん中の .* に後ろの全角スペースも含まれるからじゃない? その記法が使える環境なら、[^ ]* とか?
ってこりゃ真ん中の全角スペースで止まるか。
*じゃなくて+
/^(\s*)(\s*\S*)*(\s*)$/ これで引っ掛けられる? \sは空白、\Sは非空白ね。 ^と$は必要ないかも。
Javascriptだけどこんな感じでやってるな function trim(str){ return str.replace(/^[ \t]+|[ \t]+$/g, ""); }
最近は再帰的にマッチできる正規表現が出てきてるんですね メールのコメントをみんなどうしてるのかずっと悩んでました
後方参照は便利だね。
>>175 形式言語的な意味で「正規(正則)」な言語ではなくなってるけどね
前ってどっちですか? 後ろってどっちですか?
あー、あるあるw プログラムカウンタが進む方(番地が大きい方)が前っぽいのに、 前方参照っつーと番地が若い方だったり。
このマップが悪いのかな、マップの赤点が見づらいわ
誤爆ね
182 :
デフォルトの名無しさん :2008/08/31(日) 10:38:11
Rubyです 予め文字列を逆にしておき連続する改行の後ろだけにマッチ /\n(?=(?:\n[^\n]+)+)$/ もっとスマートな方法があれば教えてください
連続する改行の後ろだけにマッチ って事なら、リバースする前に /[^\n]+\n(?=\n+)/ じゃダメなのかな
184 :
182 :2008/08/31(日) 11:58:23
アホだ〜 ここまで解ってるなら逆にする必要なかった /^((?:[^\n]+\n)+)\n(.*)$/m これで\1と\2を取り出せば良いんですよね
185 :
182 :2008/08/31(日) 12:04:02
>>183 リバース前にそれだと前の改行にマッチしてしまいませんか?
最小一致の呪文を覚えた /\A((?:.+?\n)+?)(?:\n(.*))?\z/m 最終的にこうなりました 正規表現奥が深いです
>>84-85 この範囲[x,y]って表現は何のことですか?java/rubyでもないんですけど・・
>>187 [文字の範囲] と
{繰り返し回数} を混同してないか?
数学。あーそういうことですか。 \\s(\\w) \\s([\\w]) の違いを調べてるんですが、同じくヒットするんですけど何か違いはあるんでしょうか。 \\w => \wです。
ありません
あーそーですか。ありがとうございます。
数学上の範囲[a,b]は、プログラム的な表現は a..b や (a..b) じゃないですかね?
Javaなんですが、強欲な数量子ってのは、欲張り表現ってのでしょうか。 デフォルトでは最長一致なんですが(c+は、c+?ではない方です)、このデフォルト の挙動 c+ が強欲表現 c++ なんでしょうか? いまいち c+ と c++ の違いがわからないのですが、何か良いサンプルはないでしょうか。 ちなみに、ネタじゃないですよ
>>194 「強欲な数量子」でググれ
"ab" に対して /.+b/ と /.++b/ とか
>>194 /c+/と/c++/単独では対した違いはないが、
強欲=「バックトラックしない」だから、後ろに対して影響がある。
たとえば、/c+c/は"ccc"にマッチするが、/c++c/は"ccc"にマッチしない。
なんだバックトラックか。 rubyでも廃止予定とか言わず、サポートすればいいのに…
c++ってcが2の倍数分だけ得るって事か
>>194 c+? : non-greedy (正規表現全体がマッチする範囲で最短)
c+ : greedy "貪欲" (正規表現全体がマッチする範囲で最長)
c++ : possessive "強欲" (正規表現全体がマッチしなくなっても、とにかく最長)
丁寧にありがとうございます。
rubyの(?> )とほぼ等価ですかね。 イマイチ使う場面に遭遇しないんですけど… どういう整形に必要かわからないんですけど、パタン表現になるぐらいだから、ある程度は需要があるのかなと思います。 これら特殊表現は、サンプルが多く出てくると、表現を理解できて、使える人がたくさん増えてくるのかなと思います。
タグ処理でよくあるんですけど、 <(.+?)> <(.+)?> は何か差があるんでしょうか。
下は <> や <abcd>>> みたいなのにもマッチするぞ
>>201 正規表現を最適化するのに役立つ。
つまり「バックトラックしても無駄だ」っていうことを表明できる。
実装はそうでしょうけど、使う方からすると気にしてませんよ。 そもそもそのバックトラックの違いで速度などの差が出るようなら、regexpライブラリ使わないでしょうし。
>>205 お前が気にするか気にしないかは問題じゃない
207 :
デフォルトの名無しさん :2008/09/04(木) 09:05:39
おまえが気にするかとかよりも、バックトラックで問題が出るなら一般的には誰も使わないんじゃないですかね? 気にしてるのは、あなたの方ですよw
だから俺は気にするといってるんだが…
>>203 おお、そんなところに差があったんですか!感謝です!
気にするって、まさか自分で実装してるんですか? c のstring.h程度なら自力で実装できるんですけど・・・
211 :
デフォルトの名無しさん :2008/09/04(木) 11:36:34
バックトラックの量は正規表現を利用するだけの立場でも気にするべきことですよ。
ところでそれ、実測しましたか?
$unko =~ m!-_-!m;
正直怖いです
216 :
デフォルトの名無しさん :2008/09/15(月) 09:35:05
/\w+/にマッチし /end/にマッチしない というのをひとつの正規表現で書くのはどうすればいいですか?
否定読み
!/\W|end/ 勝手に /^\w+$/ だと思い込んでみた。
サンクス !//なんて技があるのか。 でもエディタの設定に//の中だけ書かなきゃいけないから使えないっぽい・・・ \b [^] |を駆使すれば出来そうだがめんどいな。
//の中だけじゃ、ignoreとかのフラグはどうしてんの?
チェックボックスがあるんだろ
○○あいうえお□□123 ○○かきくけこ○□345 ○○あかさたな□○567 ○○はまやらわ□□789 ○○あいうえおかきくけこ このような文字列の○○と□□を入れ替えるには どうしたらいいのでしょうか? ※○□と□○はそのままにする
(○○)(.*)(□□)(.*) \3\2\1\4
素早い返事ありがとうございます。 ただ、それだと2、3、5行目の○○が□□にならないです。
s/○○/dummy/; s/□□/○○/; s/dummy/□□/;
正規表現である文字を含まない行に一致させる方法はありませんでしょうか? たとえば あいう えおか きくけ とこのようにあった場合「お」を含まない行「あいう」「きくけ」にマッチさせたいんですが
grep -v お n.txt
>226 多バイト文字に対応しているとして ^[^お]*$ だけど、大抵の正規表現処理系において >227 のように「マッチしない」を指定する方法があるので そっちを使う方が賢明。
>>227 >>228 レスありがとうございます。
すみません正規表現で文字処理するマクロソフト使用でしたので処理系があまり詳しくあえいませんでした。
^は基本でしたね、無事 ^[^お]*$ ですることが出来ました
ありがとうございます。
しかし現行の正規表現って使いづらいよな。 読みにくく書きにくくしかも非力。もう駄目駄目。 2chの面白いレスにのみマッチするといった条件が記述できるくらい強力な オブジェクト指向か関数型ベースの正規表現を作るべきなんだよ。
文字列に対してオブジェクトや関数型ベースってどういう意味?
ブラウザによってもjavascriptの動作変わりますよね javascriptです。 123451234512345 このような文字列があった場合 /1[0-9]*5/g とするとどのようにマッチするかわかりますか? このようにして使っていたんですが、ブラウザごとに違う動作をするようでうまくいきません。 IEでは12345 12345 12345 と三つにマッチするみたいです。 このような曖昧なものにするとだめなのでしょうか。 対処策などありましたらお願いします。
いや、、、どうしたいの?
貪欲マッチで「12345」にしかマッチしないのは変だな。
Firefoxで以下を実行すると12345123451234にマッチする javascript:alert("123451234512345".match(/1[0-9]*4/g)); もちろん 1[0-9]*5 に変えると全部にヒット JavaScriptのエンジンまでとは言わないからせめてブラウザぐらい書いてくれ
IEですね、本当にすみませんでした。
WinME IE6では123451234512345にマッチした
/▶1◀▶[0-9]*◀▶5◀/ "▶1◀▶23451234512345◀" [0-9]*で残り全部にマッチしちゃって、最後の「5」があぶれそうに思えるけど、 ちゃんと全体にマッチするんだね。自分もまだ修行が足りない。
239 :
232 :2008/09/18(木) 12:27:11
IE7でした。IE7でも
>>235 さんのものを実行したら12345123451234にマッチしますね
正規表現間違っていただけかも・・
「12345」「12345」「12345」
このように3つにマッチさせたいと思ってました。
実際処理していた文字列は長いのですが
.* これを挟んでいたのになぜか
IE7では「12345」「12345」「12345」のように最短マッチのように出ていたみたいです。firefoxでは「123451234512345」
innerHTMLでの処理だったのでIEとfirefoxとでは改行?かなにか、文字列が変わっていたことが原因だったと思われます。
/1[0-9]*?5/gのように?をつけたら同じ動作をするようになりました。
レス下さった方ありがとうございます、勉強になりました。
単純な知的好奇心の質問なのですが、 123456789と適当な桁数の数値があった時、先後読みだけで3桁ごとにカンマを挿入するにはどう記述したらいいのでしょうか。 preg_replace("/(?=[0-9]{3})/", ",", "123456789"); では左から3桁以下になるまでカンマが一桁ごとに入ってしまいます。 前後逆転せずにできる方法があればお願いします。
>>241-242 ありがとうございます。
自分の頭の固さを痛感しました。
{3}+$で右側が3の倍数である時のみ、という風に指定すればいいんですね。
スッキリいたしましたm(_ _)m
javascriptで正規表現に%記号がうまく使えません。対処法はありますでしょうか? /%a/i にすると「%a」にマッチするんですが /%a5/i のように%の後に2文字以上続けるとマッチしなくなります。 エスケープもうまくいきませんでした。宜しくお願いします
245 :
244 :2008/09/20(土) 17:56:09
エンコードされた文字列にマッチさせたいと思っています。
"\%a5".search(/%a5/i); // => 0 "%a5" という3文字にマッチさせたいんだよね? 0xA5 という文字コードの文字じゃなく。
ブラウザとか環境を書けって上でも
そうです。文字エンコードされた %82%a0%82%a2%82%a4%82%a6 という文字列の中から特定の文字をマッチさせたいと考えています。 javascript:alert("%82%a0%82%a2%82%a4%82%a6%82%a8%82%a9%82%ab%82%ad%82%af%82%b1".match(/%82%a0/g)); このように実行してもマッチされないんですよね IEでも狐でもやってみましたがnullになります どこが間違っているんでしょうか
>>248 その式をコピペしたけど、IE8βでもFirefoxでもOperaでもマッチしたぞ。
何かテスト方法を間違えてる。
少しは自分で調べたり考えたりしたのか?
252 :
250 :2008/09/21(日) 03:42:18
>>251 わからないならレスしないでください。
それに質問に質問で返すのは失礼です。
あまりにも初歩的だから
>>251 の気持ちもわかるw
254 :
250 :2008/09/21(日) 04:51:58
難しく考え過ぎてた。 風呂入ってきたら自己解決しましま [|\d]*
[| ] これは必要なのか?
256 :
デフォルトの名無しさん :2008/09/21(日) 12:02:25
練馬というファイル名リネームソフトで正規表現が使えるのですが、 s/\]([^ \.].+)/\] \1/ という正規表現で何故か「従妹」が「従 妹」、「ゾン」が「ゾ ン」という風に 関係ないところまで半角スペースが入ってしまいますが何故でしょうか? ヘルプを見ると正規表現の仕様は BREGEXP.DLL に準拠すると書かれています よろしくお願いします
そのソフトは知らんが、作者が抜けてるだけだろ。
従やゾの2バイト目が SJIS で ] なんだろう。 正規表現ライブラリが日本語対応してないんだろうな。
259 :
デフォルトの名無しさん :2008/09/21(日) 18:45:09
サンクス 他の探すか作者に聞いてみます
DLL差し替えればいいじゃない
261 :
デフォルトの名無しさん :2008/09/22(月) 00:13:26
DLL自体は更新止まってるみたいです
その練馬とやらを使ってみたし、DLLの説明も見たけど、 SJISとして扱うのには、 k修飾子をつけるyぷになってるんだが ちゃんとつけてる?
って
>>256 みるとついてないね。つけてやってみては。
Visual Basic 2005で正規表現の処理を入れ子にしようとしたんだけど、 これだと、henkanに「$&」が文字列としてそのまま渡されてしまいます。 str = Regex.Replace(str, "<a href="".*?"">", henkan("$&")) perlのeオプションみたいなのは見つけられなかったのですが、 どうすればいいのでしょう?
php5 mb_eregを使用しています。 n個のパターンを後方参照で取得したいです。 例えば 'abcde' を '([a-z])([a-z])([a-z])([a-z])([a-z])' というパターンであれば 'a', 'b', 'c', 'd', 'e' ととれるのですが '([a-z])+' こんなパターンで取得することは不可能でしょうか?
266 :
256 :2008/09/22(月) 17:23:44
>>262 ありがとうございます! /kで問題なくいけました!
ちゃんと説明読んでなかった自分が恥ずかしいです・・・
267 :
264 :2008/09/22(月) 18:03:23
自己解決したので、カキコ。 まず、文字列を評価するための宣言をする Dim myEv As MatchEvaluator = New MatchEvaluator(AddressOf henkan) んで、置換部分をこんな感じにする。 str = Regex.Replace(str, "<a href="".*?"">", myEv) さらに、関数をこんな感じに作る。 Public Function henkan(ByVal url As Match) As String Dim s As String = url.ToString() s = Regex.Replace(s, "\\", "/") Return s End Function
>>265 mbじゃないなら
$ php -r 'preg_match_all("([a-z])","abcdef",$reg);print_r($reg);'
でできるんだよな。
でもそれはどうでもいいんだよな。
269 :
デフォルトの名無しさん :2008/09/23(火) 21:44:17
PHPのpreg_matchを使ってHTML文書から次の内容を検索する 正規表現で困っています。 <a href="URL">前のページ</a> <a href="URL">次のページ</a> ここから「次のページ」を囲んでいるAタグのURLを検索したいです /<a href=\"(.+?)\">次ページ<\/a>/ これだと、前のページのAタグまで含んでしまい困っています。 最左から検索するのが問題だということまでは分かったのですが解決法が分かりません。 /<a href=\"(.+?)\">(?=次)次ページ<\/a>/ こんな書き方もダメでした。 ヒントでもいいので教えていただけませんか?
>>269 > href=\"(.+?)\"
を
href=\"([^"<>]+?)\"
にでもしたらどーでしょ。
いままでMac OS9 Jeditにて正規表現での置換をしていました. 正規表現での一括置換ができる検索置換ラクダv1.01を導入したのですが 表現方法?Perlでの書き方が違うみたいで上手く置換できません. できればOS9環境で正規表現の連続置換がしたいので検索置換ラクダで可能な 正規表現をPerl初心者の私にどうかアドバイスというか答えを教えてください・・ 「全角文字の前後の半角スペースを削除」例= この MPEG は → このMPEGは {[、-◯ぁ-んァ-ヶ亜-腕弌-熙]}\s 【タブ】 \1 \s{[、-◯ぁ-んァ-ヶ亜-腕弌-熙]} 【タブ】 \1 「全角文字の前後の半角カンマを全角カンマへ」例= あ,あ → あ,あ {[、-◯ぁ-んァ-ヶ亜-腕弌-熙]}, 【タブ】 \1, , {[、-◯ぁ-んァ-ヶ亜-腕弌-熙]} 【タブ】 ,\1 「行末の西暦を括弧で囲む」例= XX, 2005 → XX(2005) XX,1998 → XX(1998) , {200[1-9]}$ 【タブ】 (\1) ,{200[1-9]}$ 【タブ】 (\1) , {19[1-9][1-9]}$ 【タブ】 (\1) ,{19[1-9][1-9]}$ 【タブ】 (\1) 「半角数字間の全角ピリオドをピリオドを半角ピリオドへ」例= 1.1% → 1.1% {[0-9]}.{[0-9]} 【タブ】 \1.\2
>>272 全角文字を文字範囲で指定するのは、
文字コードに依存するからうまくいかない環境もあると思う。
OS9って昔の環境だよな 検索置換ラクダとやらが何だか知らんし Perlのバージョンも分からんが、 多分、単に漢字を文字クラスの中で使えない可能性が極めて高い 例えば、. が漢字一文字にマッチするか試してみればいいが、 多分そうなっていないだろう
275 :
デフォルトの名無しさん :2008/09/30(火) 09:41:18
php5です
文字列
<tr>
<td colspan="2"><img height="5" src="
http://localhost/aaa.jpg " width="1"></td>
</tr>
<tr>
<td width="100" height="147"><a href="/aaaa/bbbb/" title="hogehoge"><img src="
http://localhost/aaa/bbb/ccc.jpg ">
この文字列の中のaタグのすぐ後ろのimgタグのURLを取りたく
preg_match("/"<a href=\".*?\" title=\".*?\"><img src=\"(http.*?\.jpg)\">/i", $body, $match);
こうしてみましたが、マッチしません
どのように書けばよろしいでしょうか
>>275 imgタグの中で、srcは必ず先頭に来る前提でいいのかな。
/<a[^>]+><img src="([^"]+)/
で、$1を取り出す。
空白1つを含む文字列にはマッチするけど、2つ以上連続の空白でマッチしないようにするには どうすればいいのでしょうか? ab cd ef gh この場合、"ab cd ef"にマッチ。
282 :
デフォルトの名無しさん :2008/09/30(火) 23:00:39
質問です。 ●正規表現の使用環境 サクラエディタ ver.1.6.2.0 ●検索か置換か? 検索 ●説明 XMLファイルのタグの中を検索したいです ●対象データ <aaa><bbb>hogehoge</bbb></aaa> ●希望する結果 aaa と bbb と /bbb と /aaa のみ検索される 色分けをしたいのです。 おねがいしまう
(?<=<).*?(?=>)
しまうーなら答えざるを得ない
285 :
デフォルトの名無しさん :2008/09/30(火) 23:24:06
今回のパナソニックって s/松下[電器産業]/パナソニック でいいですか?
電波ぽいのが気になるが s/松下(電器産業)?/パナソニック/ じゃないか
288 :
デフォルトの名無しさん :2008/09/30(火) 23:43:26
そうだw ()はグループ化で []は1文字だけか
289 :
282 :2008/10/01(水) 00:16:25
やっと理解できたwwwwwwwwww 理解できたってか調べるのに時間かかりました (?<=<) これで < が前に存在することを保証する .*? 任意の文字の連続(最短) (?=>) > が後に続くことを保証する 283は天才www チラ裏スマソ
お礼よりも… 分かってんだろうなボウズ
さっきからチンポ出して待ってんだから… と言えば何か分かるだろ。
そういうのりきもいよボケ
>>293 お前ここは初めてか?
いいから力抜けよ。
アッー!
最近の腐女子は正規表現も嗜むのか。 時代は進んでるな。
PHP4での処理をしております $str = preg_replace('/(<br \/>|<br>)/i', '<br />', $str); いろいろやっているうちにチンプンカンプンでしまいには変な顔文字に見えてきて挫折しそうなので どうかご教授お願いします やりたい事は$strの中のbrタグが連続して2つ以上あればそれを1つに置き換えたいです 条件として、<br>と<br />を同じ文字列として考えるのと、たまにbrの間に改行コードがあります <br>\n<br>\n<br /> → <br /> このようにbrタグの間に改行コードがあってもbrタグは連続するものとしたいです よろしくお願いします
php -r '$s="<br>\n<br>\n<br />";echo preg_replace("/((<br>|<br \/>)\n?)+/i", "<br />", $s)."\n";'
brタグのすぐ後ろの改行も吸収してしまうが $s="<br>\n<br><br />\ntest<br>\n\n<br />"; $str = preg_replace("/(<br( +\/)?>\n*)+/i", "<br />", $s);
\d+\.\d+\.\d+\.\d+ でIPアドレスを取得しようとしてますが、 127.0.0.1 にだけはマッチさせたく無いです。 どうやったらいいですか?
(((((((((((((((([^1]*)*(1+[^2][^1]*)*)*)*(1+[^7][^1]*)*)*)*(1+[^.][^1]*)*)*)*(1+[^0][^1]*)*)*)*(1+[^.][^1]*)*)*)*(1+[^0][^1]*)*)*)*(1+[^.][^1]*)*)*)*(1+[^1][^1]*)*)*
不可能ではないが2段階に分けたら? なにがなんでもひとつの正規表現でやらなきゃならない?
>>303 ((((;゚Д゚))))ガクガクブルブル
まあIPアドレスなら127.まででもいいとは思うけどな。
文字列がIPアドレスのみなら $str="192.168.0.1"; preg_match("/(127\.0\.0\.1)?(.*)/",$str,$m); echo $m[2]; でいけるよな
127…でやってみた?
s/127.0.0.1/うんこ/g /\d+\.\d+\.\d+\.\d+/gp s/うんこ/127.0.0.1/g
>>309 >308の事なら中身の有無で分岐すればおk
ドットにエスケープなんているの?
可読性
ドットってエスケープいらないの?
すまない、必要だった エスケープしないと任意の一文字でしたね
316 :
デフォルトの名無しさん :2008/10/04(土) 01:51:11
VC++でマルチバイト(ユニコードではない)日本語文字列を対象とした正規表現ライブラリの定番は何ですか?
Unicodeに変換しちゃだめなの?
318 :
デフォルトの名無しさん :2008/10/04(土) 21:25:17
ユニコード用しかないのか・・・。 VC++でまともな正規表現やろうと思ったら、ユニコード用の正規表現ライブラリしかないんですかね? VBAのRegExpコントロールとか、boostのregexとか。 いますごく困ってるのは、VBAのRegExpコントロールを使ってVC++でMBCSプログラミングをしてるんですが、 MatchオブジェクトのFirstIndexプロパティが文字数単位で返ってくることなんですよ。 MBCSだと、バイト単位でどの位置なのか知りたいのに。 もちろん対象となるテキストの先頭から2バイト文字かどうかを調べていけば、 何文字目が何バイト目かを調べることはできるけど、テキストが長くなると処理速度的に満足できない。 ユニコードで何文字目→MBCSで何バイト目を高速に計算するAPIってないですか?
あと思いつくライブラリは鬼車だけど、どうだろう 何バイト目?ってのは結局頭から見ていくしかないので高速化も難しい でも長いテキストでも見る開始位置を後ろに持っていくぐらいはできるかな
>>319 鬼車というのはちょっと見てみましたが、クセがありそうなのでやめときます。
文字数→バイト変換はやっぱり先頭から真面目にカウントするしかなさそうですね。
過去のカウント結果を保持するような文字数→バイトカウント専用のクラスを作って、
同じテキストに関するカウントの高速化をするとか工夫してみます。
MBCSの定番と言えばbregexp.dllじゃね?あるいは鬼車を同じIFにしたbregonig.dllとか。 鬼車以上にクセがあるが。
322 :
デフォルトの名無しさん :2008/10/06(月) 13:33:23
>>322 <!--shinobi1-->.*<!--shinobi2-->
ではダメなの?
<!--shinobi1-->.*<!--shinobi2-->
最長一致しちゃうから、.* じゃマズいでしょ。 途中にコメントがないなら、<! を避ければいけそう。
.*? でいいんじゃ
最短一致で何か問題あるの?
だれもそんなことはいってないが
正規表現を使わなければならない、って云ってるのに やり方が分からないってどういう事だ
その一括置換ソフトとやらが正規表現を使えるってことじゃ?
sedで、
<a href="
http:// ○○<br><br>○○ target="_blank">△△</a>
<a href="
http:// ○○○○ target="_blank">△<br><br>△</a>
にマッチングして、<br><br>を削除したいのですがどの様な記述になるのでしょうか。
(<br>){2,}
追加
□□<a href="
http:// ○○<br><br>○○ target="_blank">△△</a>□□
□□<a href="
http:// ○○○○ target="_blank">△<br><br>△</a>□□
失礼しました。<a href=""></a>の前後にも文字列があります。<a href=""></a><a hr・・・と
繰り返している可能性もあり、<a href=""></a>内で<br><br>が発生している時はsedで取り除きたいのです。
<a href="">.*?(<br>){2,}.*?</a>
>>334 有り難うございます。 <a href=".*?(<br>){2,}.*?</a> と変更しまして、ためしましたと所、
<a href=""></a>○○<br><br>○○<a href=""></a>
にもマッチングしてしまいます。
/(<a href=.+?>.*?)<br><br>(.*?<\/a>)/$1$2/ でどうだ
あ、まちごうた。これでどうだ /(<a href=.+?)<br><br>(.*?>)/$1$2/ もしくは /(<a href=[^<>]+?)<br><br>(.*?>)/$1$2/
>>337 有り難うございます。
会議が入ったので取り敢えずの中間報告です。どちらも100件の小さいログサンプルでは、
<a href="○○<br><br>○○></a>にはちゃんと働いてくれました。
良い感じだったのですが、<a href="△△">○○<br><br>○○</a>□□<a href="・・・
とリンク文字間に<br><br>が有る場合は反応いたしませんでした。
このスレに複数のbrタグを一つにする正規表現があるから それを活用するといいよ
その妙なHTMLを吐き出してる奴を修正する。
C#の正規表現で、「スペース(半角、空白)か改行しかない」という 条件はどう表現するのでしょうか。 ^\s+\n と ^\s*$ を組み合わせる事で表現出来たような気したんですが ------ a ------ もマッチしてしまいます。
空白が何を指すのかちょっとわからないけど ^\s+$ か ^\s*$で通常なら事足りるはず メソッドの使い方間違えてるかもしれないから とりあえずC#のコード貼ってみて
>>342 親切に有り難う御座います。
^\s+$ で無事マッチさせる事が出来ました。
一応メソッドの方は汚いですが抜粋すると以下の様にして判定しており
buffの中に正規表現が入っていてstTargetを判定している感じです。
for (int i = 0; i < buff.Count; i++)
{
bool regexCheck;
try
{
regexCheck = Regex.IsMatch(stTarget, buff[i]);
}
catch
{
return true;
}
if (regexCheck == true)
{
return true;
}
}
質問に来ました。 ●正規表現の使用環境 boost regexを使用した「Flexible Renamer」というファイルリネームソフト ●検索か置換か? 置換 ●説明 [aaaa][bbbb].xxx などとなっているファイル名の最初の[]だけを()に変えたい (aaaa)[bbbb].xxx となるようにしたい ソフトがバグっている可能性もあるのですが、いろいろやったけどできません。
それで質問は?
s/^(.*?)\[(.*?)\](.*)$/\1(\2)\3/ できないのはソフトのバグではない じゃあ何の所為なんだろうね
>>346 d
やっぱりできませんでした
どうもソフト自体が正規表現を受け付けないみたい、説明にもヘルプにもできるって書いてあるのになー
別のフリーソフト探します
ちょっと触ってみたけど、高度なりネームにチェック入れたか?
高度なリネームにチェックして、正規表現を選択、 検索:^(.*?)\[(.*?)\](.*)$ 置換:\1(\2)\3 で動作したが。
350 :
346 :2008/10/24(金) 12:18:31
えっ、そこからなの? ソフトの使い方とか予想外だった
HTMLのあるタグの中身が入れ子になっていても確実に外側にマッチできる正規表現ってありませんか? 正規表現だけに頼らず、HTMLをパースするしかないんでしょうか? <div class="1"> あああ <div class="2">いいい</div> </div> ↑この、<div class="2"> があろうとなかろうと、<div class="1"> に対応する</div>までをマッチさせたい
たぶん、正規表現マッチのみだと、荷が重いか無理。 その例みたいに、「divのみで2重まで」とか条件があればまだしも。
HTMLとかXMLとか扱うのなら、たいていのケースでパーズしたほうが簡単。
世の中のHTMLがまともなHTMLばかりなら それで苦労ないんだけどなw
ネストが狂ってたり閉じタグが無かったりなんてのはザラだからなー
一つの正規表現では無理だが、ループ作れば何とか。でも、自分では普通かかんよねー。 $match = ''; $str =~ /(<div class="1">)/g or die "no match"; $match .= $1; while ($str =~ m{\G(.*?</div>)}gs) { $match .= $1; last if $1 !~ m/<div/; }
現在『[\x20-\x7E]』とやって半角文字を抽出してるんですが 半角の空白のみを含まない場合は、どうやって表現したら良いでしょうか お願いします。
>>358 ありがとうございました『[\x21-\x7E]』でいけました。
ところで、vb2008のRegexクラスでは、^による否定ってできないのでしょうか
360 :
359 :2008/10/28(火) 13:01:21
使えることがわかりました。自分の記述が悪かったみたいです。ありがとうございました。
361 :
デフォルトの名無しさん :2008/10/29(水) 18:31:37
C#で 数字4桁で後ろに 何もない ハイフンが1個 ハイフンと小文字のアルファベットa-z の3パターンにマッチするには、どう書けばいいのでしょうか 例 1234 2345- 7896-d
優しさに泣いた
364 :
デフォルトの名無しさん :2008/10/30(木) 01:04:02
環境)OS:WinXP-Pro,Mem=3GB,開発ソフト:FlashCS3-Pro(Player9.0,AS3.0) Flash-ActionScript 3.0で正規表現を用いて、テキスト中の 1.2345 -0.1234 10.5678 といった数値を抽出しようと思いますが、この場合の小数点の扱いはどのようになるのでしょうか? テストで .[0-9] (小数点とその右の数値を抽出)を行ったところ、e1 というコードが現れ、 全く出鱈目な結果を得ました。 (ActionScript3.0で「.」は任意の1文字なので仕方ないのですが・・・) Flashの場合に限らず、小数点を含む類似のサンプルがありましたらご紹介下さい。
OSとメモリに和んだ 任意の一文字を表す . を \ でエスケープすれば . そのものになると思うよ
366 :
364 :2008/10/30(木) 01:31:46
>>365 早速のレス有難うございます。
たった今、手元の本で見つけたのですが、 . はAsciiコードで \x2E と表現するということなので、
これで試しましたが駄目でした(Unicode表記 \u002E でも駄目でした)
半角マイナス(\x2D)やスラッシュ(\x2F)は問題なく抽出できたのですが・・・
正規表現オブジェクトをどうやって作ったのか そのオブジェクトとどうやってマッチさせたのかわかるコードを貼ってみて もし前者で new RegExp("\x2E[0-9]") とかしてるとややこしいことになる 正規表現リテラル /\x2E[0-9]/ や /\.\d/ なら期待通りに動くはず
[.][0-9] なんて手もある。 一文字多いけど、 \ の扱いが面倒な状況だと役に立つかも。
369 :
364 :2008/10/30(木) 22:42:15
>>367-368 試してみました。コードの構成は以下の通りで、マウスクリックでのアクションです。
var str:String = "+ +-- ** / / 0120-123-456 1.2345 -0.1234 10.5678 0.0012"; //適当な文字列
this.expBtnM0.buttonMode = true;// マウスポインタを指の形に
this.expBtnM0.addEventListener (MouseEvent.CLICK, mcClick0);
// 5個のムービークリップ expBtnM0〜expBtnM4 を押して動作
function mcClick0 (event:MouseEvent):void {
var pattern:RegExp = /\x2E[0-9]/g; // <----- ここを5種類で試す
var regObj:Object = pattern.exec(str);
trace ("0 マッチング: " + regObj); // 0 マッチング: 〜 4 マッチング:
trace ("0 文字列: " + str.match(pattern)); // 0 文字列: 〜 4 文字列:
trace ("");
}
結果は、 var pattern:RegExp = /\x2E[0-9]/g; , var pattern:RegExp = /\.\d/g; ,
var pattern = new RegExp("[.][0-9]", "g"); および var pattern:RegExp = /[.][0-9]/g; の4つで可でしたが、
var pattern = new RegExp("\.\d", "g"); ではod が返されて不可でした(odの意味を調べましたが、
分かりませんでした)。
取りあえず、少数点(ドット)には var pattern:RegExp = /〜/; の形が良いようです。
アドバイス、有難うございました。
今北 最後のやつはダブルクォート中のエスケープだから実態は“.d”で 任意の1文字+dで解釈されたと思われる それをするなら“\\.\\d”だろうか どうも「\でエスケープ」の意図が伝わってなかった気がするね できたんならよしとすればいいけど
だね。ややこしいところではある
// ASコンパイラは文字列「ドット、次に d 」と解釈
"\.\d"
// 正規表現コンパイラは文字列「ドット、次に d 」を元に正規表現を作成
// 結果、任意の一文字に続いてdが来る文字列にマッチする正規表現が出来上がる
new RegExp("\.\d", "g");
こういうのにはまったら、ASコンパイラと正規表現コンパイラの二者が
(概念的には)存在することを思い出すといいんじゃないかと思う
もちろん、とりあえず正規表現リテラル /.../ 使っとこう、でも構わない
あと
>>369 のコード中の str に文字列 od が含まれていないか確認を
372 :
364 :2008/11/01(土) 11:41:13
>>371 すいません、レス遅くなりました。
ここに貼った var str:String は元が長いので、途中を省略したもので、コード上の元の
文字列には確かに od が入っています。
AS3.0の new RegExp("\.\d", "g"); だと、od(〜d) が対象になるのかなあ・・・・
●正規表現の使用環境 PHP4.3.11 ●検索か置換か? 検索 ●説明 CSVファイルを「,」で分離したいが、 「"」で囲まれているフィールドに関しては「,」で分離したくない ●対象データ AB,BC,"CD,DE,EF",FG ●希望する結果 (1)AB (2)BC (3)"CD,DE,EF" (4)FG すいません、基礎的な質問かと思いますが お分かりになる方がいらしたらよろしくお願いいたします。
CSVの分割は正規表現では完璧に表現できない プログラムで対処が一般的
>>373 PHPなら専用の関数が元からあるだろう?
●正規表現の使用環境 Ruby1.8 ●検索か置換か? 置換 ●説明 ファイル名の頭から指定の文字列Xまでをなくす ●対象データ 例)指定の文字列X → "test" ドラゴンボールtestあいうえお.txt あああいいいtest.txt ●希望する結果 testあいうえお.txt test.txt
"aaaiiitest.txt".sub(/.*?test/, "test") "aaaiiitest.txt".slice(/test.*/)
テラ早い回答ありがとうございました
●正規表現の使用環境 Perl v5.8.8 ●検索か置換か? 検索 ●説明 F1という文字列が含まれていたらヒットさせたい ただしF1の前にFが付いている場合はヒットさせたくない ●希望する動作 "F1 ほげほげ" →真 "FF11 ほげほげ" →偽 [^F]F1 [^F]?F1 などと試して見ましたが失敗でした
自己解決 これでうまくいきました ^F1|[^F]F1
否定戻り読みとか使うのもいいだろう。 (?<!F)F1
382 :
デフォルトの名無しさん :2008/11/08(土) 14:36:05
これ間違ってる? (?<=aaa)bbb 直前にaaaがくるbbbにマッチ(先読み)。 (?<!aaa)bbb 直前にaaaがこないbbbにマッチ(否定先読み)。 aaa(?=bbb) 直後にbbbがくるaaaにマッチ(戻り読み)。 aaa(?!bbb) 直後にbbbがこないaaaにマッチ(否定戻り読み)。
●正規表現の使用環境 lex ●検索か置換か? 検索 ? ●説明 C言語のコメントで使われるような書式の検索 /*で始まり*/で終わるような文 ただし途中で*/は出現しない 漢字コードはEUCです。 コメントが英数字だけならできそうなのですが 漢字などが入ってくるとよくわかりません。 よろしくお願いします。
EUCなら、漢字がバラになっても英数字とコードが重複しないから 問題ないのでは?
>>387 できれば正規表現を教えてもらえないでしょうか?
英数字は[a-zA-Z0-9]のようにできると思いますが
ひらがなやカタカナは[あ-んア-ン]のようにはやはりできませんよね?
文字コードで書くのでしょうか。。。。
>>388 この場合、正規表現にひらがなやカタカナを書く必要ないでしょう?
>>389 コメント/**/の中にひらがなやカタカナ、漢字、英数字がでて来ると思うのですが
必要ないのでしょうか?
例として
「/*(A|***B)*/」
Aは「*、/」以外の文字を表しBは「/」以外の文字を表す。
演算の*と混乱をさけるためアスタリスクは全角大文字にしているが
実際は半角にする。
このAとBを表したいのですが。。。。
例えば[0-9a-zA-z(漢字コード?)^/*(/と*を除く)]のようにすればいいのでしょうか?
後出しで条件つけるなよ・・・
>>390 目的は、コメント中の「*」を「*」にすること?
>>391 すみません、質問の仕方が悪かったです;
>>392 いえ、「/*(A|***B)*/」の「*」は本当は「/*(A|xx*B)*/」
とかけてC言語ではかけるの「x」は「*」で、
正規表現の0回以上繰り返す「*」とかぶってしまうため
「/*(A|***B)*/」とかかないで「/*(A|***B)*/」と書いていると思います。
何がしたいのかはlexを使って字句解析をしたいのですが
コメントの部分をスルーするための正規表現の仕方がしりたいのです。
字句解析するなら /* と */ だけ検知して 途中は読み飛ばせばいいような気がするんだけど、そうじゃないの?
英数字なら出来そうとかのたまっているけど、まずはそれで実装してみりゃいいじゃんね。 それでEUCコードの部分で引っかかるようなら改良すればいい。
ダメだこりゃ
>>394 が正解。
コードで書くのは簡単なんだが、正規表現にするには独特のコツがいるという
タイプの問題なので、下手にこだわるよりさっくり問題そのものを別の方法で
解決してしまったほうが早い。
よく分からんが、最短マッチが使えないからどうしようって話か? /* -> COMMENT状態に遷移 */ -> 戻す でいいんじゃね
>>394 /*と*/を検知するには
{^/*}{/*$}のような感じでいいのでしょうか?
行が複数行になったらおかしくなりませんんかね。。。。。
ん、あれ? 別の板の正規表現スレで似た話があったから、その続きかと思った。 量指定子を+と*で書くと、 /*([^*]|*+[^/*])**+/ となる。
>>400 回答ありがとうです<(_ _)>
よく考えて見ます。。
ちなみにマルチはしていません@@
コンパイラコンパイラで使用できる正規表現というかEBNFは、しょぼくて、マルチバイト 対応するの大変だから生成されたパーサだけ使用して、スキャナは自前実装がお勧め。
403 :
デフォルトの名無しさん :2008/11/11(火) 04:08:42
●正規表現の使用環境
Excel & 正規表現検索
※
ttp://srcedit.pekori.jp/tool/excelre.html ●検索か置換か?
置換
●説明
英単語のみ先頭文字を小文字化
●対象データ
One
Two
Three3
●希望する結果
one
^
two
^
Three3
^^^^^^^
○自分の経緯
検索:(^[a-z])([a-z]*)
置換:[LOWER]$1$2
結果:One ⇒ [LOWER]One
○知りたいこと
このアドインにある「特殊置換」を利用する際の文法
以上、お願いいたします。
おれなら Excel をデスクトップの「ごみ箱」へD&Dする
コントロールパネルからアンインストールしないと意味ないって警告出るだろ。
406 :
デフォルトの名無しさん :2008/11/12(水) 05:26:09
mmMMamUUqpndbback
407 :
403 :2008/11/12(水) 05:43:22
それができたら、どんなに楽か・・・
408 :
デフォルトの名無しさん :2008/11/12(水) 20:14:38
とりあえずこのスレ
>>1-10 まで流し見て全く理解できなかった
もう一度読んでみるのが怖い
>>403 特殊置換は変換後にそれだけしか書けないんじゃない?
とりあえず変換するだけなら↓でいけないか
変換前:^[a-z]+$
変換後:[LOWER]
検索:A([a-z]*) 置換:a$1 検索:B([a-z]*) 置換:b$1 検索:C([a-z]*) 置換:c$1 検索:D([a-z]*) 置換:d$1 検索:E([a-z]*) 置換:e$1 検索:F([a-z]*) 置換:f$1 検索:G([a-z]*) 置換:g$1 検索:H([a-z]*) 置換:h$1 検索:I([a-z]*) 置換:i$1 検索:J([a-z]*) 置換:j$1 検索:K([a-z]*) 置換:k$1 (省略されました続きを読むにはここをクリックしてください)
411 :
デフォルトの名無しさん :2008/11/14(金) 12:10:39
●正規表現の使用環境
Repl-Ace
※
ttp://www.sirmiles.com/repl_ace/ ●検索か置換か?
置換
●説明
testA
きょう
あした
testEndA
や
testA
あした
あさって
しあさって
testEndA
のようなtestAからtestEndAで囲まれている文字列(改行あり)を特定文字列に置換
●希望する結果
testA
1週間前
2週間前
testEndA
正規表現を魔法のプログラミング言語だと勘違いしてないか?
そのツールでうまくいくかどうかわからんが パターン testA\n.*?testEndA\n 置換文字列 testA\n1週間前\n2週間前\ntestEndA\n でいいのか? 何を期待してるのだかよくわからんが...
処理系によってはドットは改行とマッチしないので注意。
正規表現に通じている先輩は正に魔法のように正規表現を使ってあらゆるリクエストに解を提示している。 あんな人になるには一体どうすればいいんだろうか?
とりあえずふくろう本は読んだか?
やっぱりあのそこそこ分厚い青い本に挑戦したほうがいいみたいですね。TODOリストの一番上に上げときます。
正規表現って何なんだよ 表現に正規も糞もあるか!
正則表現という訳も、あるにはある。
「正規表現」という表現は、確かに適切でない。 では何が良いかといわれると、判らない。 明治時代の人々は、偉大だった。
regular expression を無理やり「正規表現」と訳しただけ。 アテ字と言って過言ではない。意味を深く考える必要は無い。
「帝王切開」 みたいなもんだな。
は?
洗濯を選択だな
何それ気になる
形式言語理論の分野では正則表現ともいう まあ今時の言語で使えるような正規表現はもはや正則言語で表現できる範囲を 越えてたりするんだけどね
性器表現
モザイクやハレーションか。 「♪ヤッホー FORTRANランラン」並みに手垢が付いたネタだな。
>性器表現 >手垢が付いたネタ つまりエロ本のことだな
430 :
デフォルトの名無しさん :2008/11/16(日) 14:47:16
よろしければ、お知恵をおかしいただきたいです。 "あるマックなどPCがあり、マックなどのコンピュータ" の文字列から、/マックなどの?(.+)/のような正規表現で、「PCがあり、」「コンピュータ」の文字列を 取得したいのですが、うまくいきません。この場合、どのようにするのがよいのでしょうか? よろしくお願いいたします。
環境を書けば答えられるの?
出来ない、というのも答えの一つだしな
434 :
デフォルトの名無しさん :2008/11/16(日) 20:14:40
>>431 430です。
Ruby 1.8.6、UTF8です。
お願いします。
>>431 ほら、質問者が環境書いたぜ。
「出来ない」 って答えろよ。
文字列を切り取りたいわけだろ? 文字列を切り取るには、何が必要だ? どこから、どこまで。スタートとエンドだ。 /マックなどの?(.+)/ これにはスタートはあるが、エンドが無い。 どこまで切り取ればいいのか不明なんだよ。 どこから・・・マックなどの? どこまで・・・ ←これを決めろ。
>>435 何なんお前
建設的なレスできないなら無駄なレスすんなよ
で?環境書けば出来るの?
うん
>>430 str = "あるマックなどPCがあり、マックなどのコンピュータ"
re = /あるマックなど(PCがあり)、マックなどの(コンピュータ)/
puts re.match(str).to_a[1..2]
↑↑ 氏ね
次の マックなどの?(.+) もしくは行末までなんじゃないかな。
片仮名と平仮名の境目で切るのかな。 状態を持つ物なら、何らかのプログラミング言語を使わないと。
他人が勝手に仕様を決めていいのかよ
>>421 最初に訳した人が誰かは知らないが、regularの捉え方を間違えている。
正しいではなく、普通のと言う意味あいで(例:レギュラーガソリン)
汎則式とでもしておけば、初学者の違和感も起きないものを…
どうでもいいですよ
みんなチョムスキーが悪い
すみません。教えてください。 ●正規表現の使用環境 サクラエディタ ver.1.6.2.0 ●検索か置換か? 置換 ●説明 フルパスが記述されたテキストファイルをとあるソフト(画像ビューアのHamana)のリストファイルにしたい ●対象データ C:\Program Files\Windows Media Player\wmplayer.exe ●希望する結果 D=C:\Program Files\Windows Media Player\ F=wmplayer.exe 行末の直前の\を置換すればいいのかな?と思ったのですが 指定の仕方がわかりませんでした・・・
とりあえず 置換前:^(.*\\)(.*?)$ 置換後:D=\1\r\nF=\2
451 :
デフォルトの名無しさん :2008/11/18(火) 12:09:47
<img width="120" height="180"> </img width="120" height="180"> <img width="120" height="180"/> という文字列をすべて width="120" height="180" width="120" height="180" width="120" height="180" にしたいのですが秀丸の置換で 検索→.* (.*)[/>].*$ 置換→\1 とやってるのですが width="120" height="180" width="120" height="180" width="120" height="180"/ と、さいごのスラッシュが消えません。 是非助言をください!・・・もう何時間もやってるんです(汗
452 :
デフォルトの名無しさん :2008/11/18(火) 12:14:47
.* (.*?)[/>].*$ でいけました!お手数おかけしました!
とても大変だと思うのですが、よろしくお願いします。 ●正規表現の使用環境 Windows上で動く「Perl5の正規表現と互換性のある」とマニュアルに書いてある フリーの(今はシェアになっています)クリップボード拡張ソフト マニュアルには、参考事例として ・複数行のテキストに含まれている空白記号をすべて削除する [@ s/[ ¥t ]//gmk] ・複数行のテキストに引用記号をつける [@ s/^/> /gmk] などが書かれています。 ●検索か置換か? 置き換え です。 ●説明 窓の杜などからソフトウェアのファイルをダウンロードするときに、 そのソフトをレビューした記事のタイトルをダウンロード先フォルダの名前にしています。 しかし、記事からタイトルをコピーして、フォルダ名としてペーストするだけでは 「ファイル名には次の文字は使えません。」という警告をWindowsから受けてしまうことが頻繁にあります。 Windowsでフォルダ名に使えない文字を削除しつつ、無意味な連続する空行を削除し、 ペーストしただけでフォルダ名として使える文字列へと変換できる正規表現を考えていただけないでしょうか?
454 :
453 :2008/11/20(木) 09:34:37
●対象データ1 「改行」 Moo0 オーディオ再生器「改行」 コンパクトで軽快に動作し、直感的に操作できるオーディオプレイヤー「改行」 「改行」 for Windows「改行」 ●希望する結果1 (フォルダ名に改行を使えないので、全ての改行をアンダースコアに置き換えつつ1行の文字列へ) _Moo0 オーディオ再生器_コンパクトで軽快に動作し、直感的に操作できるオーディオプレイヤー_for Windows (先頭のアンダースコアはあってもなくても構いませんが、無い方がうれしいです) ●対象データ2 シンプルかつ高機能な音楽プレイヤー foobar2000 バージョン【0.9.5.6】 ●希望する結果2 (ここまでの変換に加え、連続する空白、TABをひとつのアンダースコアに置き換えつつ、さらに末尾の空白を削除) シンプルかつ高機能な音楽プレイヤー_foobar2000_バージョン【0.9.5.6】 ●対象データ3 (○アールはregistration symbolと呼ぶらしい丸の中のRなのですが、打てませんでした。) 1. Intel○アール Graphics Media Accelerator Driver for Windows* XP (exe) (20476KB) 14.36.4.5002 2008/10/24 ●希望する結果3 (ここまでの変換に加え、registration symbolを(R)へ、フォルダ名に使えない文字/をハイフンへ) 1.Intel(R) Graphics Media Accelerator Driver for Windows* XP (exe) (20476KB)_14.36.4.5002_2008-10-24
455 :
453 :2008/11/20(木) 09:35:51
なお、Windowsでフォルダ名に使えない文字列は \ / : , ; * ? " < > | および 改行 とのことなので、これらを含まない形へ整形できたらと思います。 これらを一度に処理することが、正規表現で可能なのかどうかも分からないのですが、 もし、できそうなら、どなたか編み出してもらえないでしょうか? よろしくお願いします。
とりあえず、 s/[\\\/:,;*?"<>|]/_/g みたいな。細かい改良点は自分で考えなよ。
457 :
デフォルトの名無しさん :2008/11/23(日) 00:32:05
………[2バイト文字][改行] [2バイト文字] ↑このパターンを ………[2バイト文字][2バイト文字] にするにはどう書けばよいでしょうか?
s/\n//
>>457 テンプレくらい読め。
それにそんだけじゃ情報が足りなすぎだ。
どうせ元データは何百行とあるんだろう?
どういう行とどういう行を連結したいのか位は明確にしろ。
●正規表現の使用環境 Devas 3.4 ●検索か置換か? 置換 ●説明 各行先頭にある 空白4つと数字(1から85)、ピリオドを抜き出したい 例えば 1. 120.136.16.13:3128 2. 94.178.64.37:48018 79. pps.nntime.com:554 このようなIP+Portの前にある文字列のことです。 ●対象データ 1. 85.
^ *\d+\. もし空白やドットが不要で通し番号だけ拾うのなら、 ツールにもよるけど ^ *(\d+)\. とか適当にアレンジして試しておくれ
>>461 ありがとうございました!
^ *(\d+)\.
これでIPとPortだけに置換することができました。
よろしくお願いします。 ●正規表現の使用環境 Flexible Renamer(Perl5互換) ●検索か置換か? 置換 ●説明 ファイル名の一部を別の位置へ移したい。 ●対象データ (日付)(場所)hogehoge というフォルダ名や (日付)(場所)hogehoge,jpgというファイル名 ●希望する結果 (日付)hogehoge(場所)や(日付)hogehoge(場所),jpgというようにしたい。
その日付や場所を特定するための法則は?
それぞれ 「()」 でくくってあります。ともに一緒の括弧だとまずかったりしますか?
ああ、その括弧は実際も括弧だったのねw
>>464 s/^(\(.+?\))(\(.+?\))(.+)(\..+)?$/$1$3$2$4/
ありがとうございます。 自分の悩んだ時間などウソのようにすっきり成功してしまいました。 今までも正規表現を使いたいと思って色々サイトを巡ったのですが 今回の答えも答えをもらって、見れば分かるぐらいの理解しかないのです。 良い学習サイトなどがあれば教えてくれませんか?それともオライリーの本を買うべき?
とりあえずソフバンあたりで出してる入門書でもいいから 一冊読んだ方がその後が楽になる
>>468 が理解できるのなら、正規表現の基本はできてる気がする。
(カッコのエスケープ、最短マッチ、後方参照あたり)
もしプログラミングの経験がなければ、そっちを補ったほうがいいと思う。
正規表現も一緒に学べる『初めてのPerl』『たのしいRuby』あたりお勧め。
リネーマーも自分で作れるよ。
おお、このスレの人は優しい人ばかりですね。 プログラムはPHPぐらいで、しかも正規表現がどうしても必要な場面に 遭遇した事がありません。 これからこのスレをROMったり、挙げてもらった本も入門書のようですので 探して見て勉強してみようと思います。 ありがとうございます。
■質問 2ch のレスの >>*** を、テキストエディタを用いて #aa(){{{>>***}}} に置換したいのですが、方法はありますでしょうか?
>>*** のうち、どれが固定でどれが可変なのか区別がつかないと答えられない。
もし全部固定なら、そのままエディタの置換機能を使えば済む。
>>5 を見て、対象データの例と希望する結果を書いてくれ。
>>476 検索 >>(\d+)
置換 #aa\(\)\{\{\{>>$1\}\}\}
置換後の文字列が↓のようになってしまいました。 $1 のところを \d+ や (\d+)、$\d+、$(\d+) に変えて色々やってみましたが ダメでした。置換には EmEditor Pro 7.02 を使っていますが、 何かやり方が誤っているでしょうか? #aa(){{{>>$1}}} #aa(){{{>>$1}}}
それはソフトの使い方を読むか、サポートに聞け
>>478 後方参照を $1 ではなく \1 で行う
置換 #aa\(\)\{\{\{>>\1\}\}\}
>>480 お返事遅れました。
すっげwマジで出来たw 正規表現って本当にすごいですね。
自分は \t や \n 等、基本的なものしかわからなかったのですが、
今回の質問が非常に勉強になりました。
次に疑問が湧いた時には、正規表現でできないことはないという姿勢で
解決に望もうと思います。
ありがとうございました。
>>480 その括弧のエスケープはなんかいみあるの?
■追記 ちなみに、今回の置換の目的なのですが、 atwiki という wiki のページで > のような特殊文字を書くと、 適切に表示がされない不具合(?)があるので、 アスキーアート表示用のメソッド #aa(){引数} を用いて、> を囲みたいなと思ったのが目的でした。 初めは手動でやっていたのですが、あまりにも数が多いので 置換化できないかな、と思った次第です。 長文失礼いたしました。
484 :
480 :2008/11/29(土) 15:01:52
置換文字列なので無いw 置換 #aa(){{{>>\1}}} こうだね。 吊ってくる
>>482 ,484
小かっこ () って、正規表現モードでも \ をつける必要ないんですか。
勉強になりました
>>485 置換文字列は正規表現じゃないというだけ。
正規表現で書かなきゃいけないところで()そのものを書くには
エスケープする必要がある。
●正規表現の使用環境 .NET FrameworkのRegexクラス。 ですが、Perlなどの正規表現でもかまいません。 ●検索か置換か? 検索です ●説明 エスケープ記号(\)がついていない括弧で囲まれた文字列の検索が目的です。 [^\\]\((?<content>[^\(]+[^\\])\)という正規表現で試したところ、 入力文字列"a(b)"で正しくマッチし"a\(b)"や"\(b)"で正しくマッチしないのですが、 "(b)"では本来マッチしてほしいのにできなくなります。 ●対象データ エスケープ文字がついてないカッコで囲まれた文字列 ●希望する結果 マッチ: "a(b)", "(b)" 非マッチ: "\(b)", "a\(b\)", "a(b\)"
488 :
487 :2008/11/30(日) 14:12:51
申し訳ありません。(^\(|[^\\]\()(?<content>[^\(]*[^\\])\) で解決しました。
/(?<!\\)\((?<content>.*)?(?<!\\)\)/
490 :
デフォルトの名無しさん :2008/12/03(水) 17:36:22
aaa777 あああああ
aaa778ああああ
aaa7
aaa7あああ
aaa7aaa8
aaa7 aaa8
目的はaaa7をbbb7に置き換えたい。
しかしマッチ方法で苦しんでいます お助けを・・
/aaa7/ これでは全部置き換わる
/aaa7[^\d]/これでは 下の3つが余計な部分含めてマッチしてしまう。。
下から4つ、aaa7のみマッチさせる方法はあるでしょうか。
http://www.rider-n.sakura.ne.jp/regexp/regexp.php ここで簡単に調べられるのですが宜しくお願いします。
Perl互換の正規表現にチェックをいれていただけるといい感じです。
aaa7(?=[^\d]|\Z) そのチェッカーとやらの使い方がよくわからんので試してないが。 (?=ほげ) で先読みが、\Z で改行または文字列末にマッチ、ができることを 前提としている。 何を使っているのかよくわからないが(PHPのPerl互換モード?) 先読みと改行と文字列末の扱いを確認してみること。
よく考えたら /aaa7(?!\d)/ でよかった。
494 :
490 :2008/12/03(水) 18:28:57
>>491 もうしわけないです次から気をつけます。
>>491-493 ふむふむ 先読みという事ができるのですね
結果うまくいきました!ありがとうございました。
先読みと改行と文字列末 これを詳しく勉強してみます。
よくそれだけで答えられるな
こう読んだけど違うのかな
s/aaa(?=7)/bbb/
>>494 が来てたのでもういいみたいだけど
496 :
492 :2008/12/03(水) 18:47:11
[^\d] は \D でよかったな。
>>495 aaa777 にもそれだとひっかかるよね?
それにはひっかけたくないらしかったから。
497 :
:2008/12/05(金) 00:09:56
()() [][] {}{}
ふらっとC#,C♯,C#(初心者用) Part34
ttp://pc11.2ch.net/test/read.cgi/tech/1227521785/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+\.?)+)$ 出マッチする場合とと同じ文字列が得られる、末尾にカンマが合っても処理が遅くならないパターンがあれば教えてください
>>498 (\w+)+ みたいな感じになるから遅いんだろうねえ。
\s+\w+(\.\w+)*$
でどうか。
キャプチャするから \s+(\w+(\.\w+)*)$ こうか。
501 :
498 :2008/12/06(土) 23:56:46
>>499 ,500
ありがとうございます、見違えるように早くなりました
(\w+)*は良くても(\w+)+は遅くなるんですね
>>501 > (\w+)*は良くても(\w+)+は遅くなるんですね
んー、そういうことではないぞ。
\.? は有っても無くてもいいけど、(\.\w+)* の \. は必要でしょ。
(\.?\w+)* にしたらやっぱり遅くなるはず。
(\w+\.?)+ は「.xxxxxx」だけにも何通りもマッチの仕方があるけど、
(\.\w+)*は1通りしかマッチできない。この違いだよ。
503 :
498 :2008/12/07(日) 10:07:49
>>502 ? と +(もしくは*) の組み合わせが最悪だったわけですか
今度から注意します
>>503 なんかまだ誤解してるっぽいな。
*)*
みたいに、カッコの内側の最後に繰り返し指定(*やら+やら)があって、
その外側すぐにも繰り返しがあるのが問題(になることが多い)。
498が最初に書いたようなマッチしないデータを食わせたときに、
バックトラック回数がとんでもなくでかくなって遅くなる(可能性がある)。
505 :
498 :2008/12/07(日) 15:05:16
>>504 理解が遅くてすみません、ようやく分かりました
丁寧にありがとうございました
正規表現が手に入れた強力すぎる「構文理解(マッチ)能力」って、 外国語の翻訳に使えそうな気がするんだけど、その観点での研究って進んでないの?
そりゃ無理でしょ。 yaccやbisonで実用になる翻訳ソフトが作れるって話は聞かないから。
>>506 正則言語はそんなに広いクラスじゃないぞ
>>506 一般の自然言語と正規言語では言語のクラスとして天と地ほどの差があるよ。
たとえば、多くの自然言語は無限回のネストを許容するが、これは正規文法で表せない。
お前らちゃんと日本語話せよ何言ってるか分かんねぇよ
お前が勉強不足なだけだ。
なんて面白みの無い、むしろマイナスなレスなんだ
●正規表現の使用環境 PHP4.4以降 ●検索か置換か? 検索後、個々に置換 ●説明 ユーザーが入力したhtmlデータ内に 特定の文字で囲まれたものを変換したい。 %test%や%nullpo%など。 ●対象データ フォームで送信されたhtmlデータ <html> <head> </head> <body> %adv% あいうえおかきくけこ<br> %adv% </bnody> </html> ●希望する結果 %adv%を発見した位置を返し、それを指定された文字列で置換する。 %adv%は全て同じではなく、別の文字をそれぞれ割り当てたい。 よろしくお願いします。
>>513 >%adv%は全て同じではなく、別の文字をそれぞれ割り当てたい。
この時点で、正規表現でやるのには無理がある。
状態を持つには何らかのプログラミング言語で。
HTMLならJavaScriptか。
PHP使ってるからテンプレートエンジン使ったらどうだろうか
よくわかんないけど、%date%→2008/12/12 %name%→田中みたいにして
%name%様への%date%のお知らせです。
が
田中様への2008/12/12のお知らせです。みたいになるようにしたいんじゃないの?
正規表現っていうか普通に置換すればいいだけじゃないの?%name%→%date%とかなると置換順序によってはおかしくなるから、
そこは%name%を%date%で置換したいなら%%date%%と入力しといて後で%%を%に(ryみたいにすればいいと思うけど。
>>514 は何が言いたいのか良くわからない。
>>515 に同意。Smartyとか使えば全部やってくれるから楽だけど…
>>516 >%adv%は全て同じではなく、別の文字をそれぞれ割り当てたい。
この文章を素直に解釈すると、同じ「%adv%」でも状況に応じて
「こんにちは」にも「さようなら」にもなるって事じゃないのかな。
で、そういう状況依存的な内部状態を持つ操作は、
変数や条件判断文のあるプログラミング言語でないと不可能。
何か変?
518 :
506 :2008/12/13(土) 22:59:58
>>507-509 正規表現の(現時点での)限界があることはわかりました。
が、自然言語の「(ある種の)典型的な表現」を滑らかに翻訳するという狭いクラスのタスクに対しては
正規表現がその強力な威力を発揮できると今でも思っています。
限界とか威力とか意味わかんね。 正規表現なんて正規文法を別の記号で書き直しただけじゃん。 数学的に厳密な定義のあるものなんだから、 明日になって威力が変わったりしないよ。
正規表現を、どんな夢でもかなえてくれる魔法の呪文とでも勘違いしてないか?
文法の表現力では 正規文法 < 文脈自由文法 < 文脈依存文法 < 解析表現文法
522 :
デフォルトの名無しさん :2008/12/15(月) 00:24:39
ABCを含まない行にマッチさせたい場合 ^(?!.*ABC) ←OK (?!.*ABC) ←NG となるのでしょうか? 上記の違いが分かりません
524 :
デフォルトの名無しさん :2008/12/15(月) 00:49:37
^があるとなぜ食えないんですか?
/^(?!.*ABC)/の場合、まず/^/が文字列の頭にマッチする。 そこから後ろ(即ち元の文字列全体)が、/^(.*ABC)/にマッチしなければ、全体としてマッチする。 /(?!.*ABC)/の場合は、どんな文字列であっても末尾にマッチする。 なぜなら文字列の末尾から後ろ(即ち空文字列)は/^(.*ABC)/にマッチしないから。
>>517 あーなるほどね。1回目の%adv%では「こんにちは」、2回目の%adv%では「さようなら」にしたい、とかか。
そりゃ正規表現じゃ無理だわ。いや、限定的な状況ならいけるかもしれないけど。
含まない行、のような指定は、できるなら -v オプションとか 正規表現より上のレイヤでやったほうがよい。
それはスレ違い
いいんじゃない? 正規表現だけでは何もできないんだから。 perl とか、テキストエディタとか、そのた言語と組み合わせないと。
perlとかテキストエディタとかその他の言語のサポートまではしてられないってことだろ。よう知らんけど。
>>527 はどこまで正規表現を使うべきかという立派な正規表現ネタに見えた。
正規表現で実現可能なことは無理してでも正規表現を使え
なんていう愚かなスレでもないだろうw
実用的な解と、パズル的な解か。
例えば、 ABC と DEF という文字列があったとき、 ABCの場合 ABC (123) DEFの場合 DEF (345) という形に置き換えるのは可能でしょうか? また、可能ならどのように書いたらいいでしょうか
>>533 できる。正規表現は
/ABC/
/DEF/
意地悪はさておき、ABCやDEFを検出するのは正規表現だけど
置換をするのはそれぞれの「実装言語や処理系ソフトウェア」だから
>>5 のテンプレ埋めてくれないと答えられない。
535 :
533 :2008/12/22(月) 15:54:12
すみません 訂正します ●正規表現の使用環境 Jane Style Version 3.01 ●検索か置換か? 検索後に置換 ●説明 文字列にマッチさせた後、マッチした文字列ごとに指定された文字列を後ろに 追加させて置換させたい ●対象データ @ ABC A DEF ●希望する結果 @ ABC (123) A DEF (345)
普通の置換でよくね?
すみません、説明が足りませんでした この二件だけの場合は二つ表現を書けばいいですが、 後ですぐに置換したい文字列を追加できるよう、(ABC|DEF)のように orか何かでまとめて作りたいと思っています それは可能でしょうか それともやはり一つ一つ書いたほうがいいでしょうか
てか、Jane Style って専ブラだよね? どういう機能で何をしようとしてるのかがわからないとどうにもアドバイスのしようが... (このスレは基本的には、grepやawkやPerlやPythonやJavaの正規表現のスレなので)
<rx2>(?<=ABC)[TAB] (123)[TAB]msg <rx2>(?<=DEF)[TAB] (345)[TAB]msg
>>538 あまり正規表現について詳しくないもので
やはりちょっと無理がありましたね・・・
>>539 すみません
少し勘違いをしていました
>>540 有難うございます!
すごくスッキリしていていいですね
参考にさせて頂きます
543 :
デフォルトの名無しさん :2008/12/27(土) 19:09:30
perl で abc-def-1234-ghi-jkl これから abc-def を取りたい 1234は数字が4文字です 1234の前を取るのはどうすればいいですか?
「取る」とは?
「抽出したい」 → 結果として abc-def が欲しい
「削除したい」 → 結果として -1234-ghi-jkl が欲しい
どっち?
できれば
>>5 を参考に。
もっと高級言語っぽい表記で書けるといいのになぁ。
(ちょっと変えました) 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
>>546 12-34でもその一般化したパターンでも使ってマッチングさせてから
特殊変数 $` や@- を参照するなり他の手段で抜き出すなりすればよろしかろ?
>>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 :
デフォルトの名無しさん :2009/01/01(木) 12:55:59
単純にたくさんのテキストファイルから目当てのキーワードのある行を 正規表現で検索したい場合、Windows環境だとどのツールが便利・一般的なの? 秀丸かな? Unixだとgrepコマンドがあるけど…
>>550 一般がどうかはしらないけど自分は秀丸やxyzzyの機能を使ってる
grepでいいよ
XP以降だと標準でfindstrコマンドがあるね Cygwinを入れるのもいいし、各種テキストエディタに頼るのもいい でも一番の検索ツールは、 | 何について調べますか? | ┌────────────┐ | | | | | | | └────────────┘ | [ オプション(O) ] [ 検索(S) ] | `──────────┐ ┌─── , '´l, ..| ./ , -─-'- 、i_ |/ __, '´ ヽ、 ',ー-- ● ヽ、 `"'ゝ、_ ', 〈`'ー;==ヽ、〈ー- 、 ! `ー´ ヽi`ヽ iノ ! / r'´、ヽ `´ヽノ
| 何について調べますか? | ┌────────────┐ | | おまいの消し方 | | | | | └────────────┘ | [ オプション(O) ] [ 検索(S) ] | `──────────┐ ┌─── , '´l, ..| ./ , -─-'- 、i_ |/ __, '´ ヽ、 ',ー-- ● ヽ、 `"'ゝ、_ ', 〈`'ー;==ヽ、〈ー- 、 ! `ー´ ヽi`ヽ iノ ! / r'´、ヽ `´ヽノ
555 :
550 :2009/01/01(木) 14:13:35
さんくす、やっぱりそのへんかぁ。
556 :
551 :2009/01/01(木) 14:17:19
このスレのせいで550がイルカの虜になってしまった なんて親切なスレなんだ
557 :
553 :2009/01/01(木) 14:17:59
2007ではイルカ出なくなってるよね
冴子先生がいい
スターウォーズのジャージャービンクス Office のイルカ 大ヒットメーカーが調子に乗りすぎて生み出してしまった 世界の2大うざキャラ。
なんかわかるw
perlで下のような場合にマッチさせたいのですが、どのようにすればいいのでしょうか? <[a-z]+ lang="ja">.*?</[a-z]+> 最初の[a-z]+と最後の[a-z]+は同じタグを指定したいのですが、 このままだと、</a>や</b>といった終了タグが先に引っかかってしまい、 いびつな形でマッチしてしまいます。
>>562 正規表現一発じゃキツい
スキャナを書くか、素直にHTMLパーザ使った方が
>>562 バックリファレンスかな
<([a-z]+) lang="ja">.*?</\1>
こんな感じで
単純にそういう条件だと\1使えばいいんじゃ? いろいろやるつもりなら 結局パーサ使った方が楽ってことになりそうだけどね。 $s = q{<hoge lang="ja"><a>hogehoge</a><b>hoge</b></hoge>}; print $& if $s =~ m{<([a-z]+) lang="ja">.*?</\1>};
>>564-565 > <([a-z]+) lang="ja">.*?</\1>
でうまくいきました。
残念ながら、XMLパーサの使い方がわからない。勉強しないとなぁ…
目的は和英中が混在しているxmlから日本語の部分だけ抽出したかったので、
今回はこれで十分です。
XMLとHTMLタグが混在した形式だったんですが、何故か、HTMLタグにlang設定が
されていて途方にくれていました。
たとえば <xxx lang="ja"><xxx>foobar</xxx></xxx> というときにちゃんと取り出せないねえ 本当にちゃんとやろうとしたら正規表現だと無理だな
XMLは文脈自由文法だからPCREの拡張とか使わないと無理
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),$/;
正規表現のライブラリを自作してるのですが参考になるサイトはないでしょうか。 容易な拡張性を確保するためにオブジェクト指向を使って実装してます。 例えば inputstr[k] == pattern[k] ? ではなくて pattern.can_eat(inputstr[k]) のようなpatternをレシーバ(インスタンス)としたかんじです。 現在はグループの中にグループがあるとどうやって解決するか悩んでいます。 (ab(cd|ef)gh) などで、一応JAVAで実験してます。
pattern.can_eat(inputstr[k]) ? pattern.contains(inputstr[k]) ? などでboolean関数です。 性能は速いかどうかではなく、コンパクト・コードサイズ小さいなど目指しています(機能拡張はオブジェクト指向と同じくプラグインしますんで)。 構文木を作るとかではなく容易にスクラッチから書ける程度のコードサイズで、かつ動的に実行時に機能追加できると言うのが条件で作っています。
他の言語の正規表現APIは参考にしてる? OOならJava, Ruby, Python, .NETとあると思うけど
あれ?反応ないですね。 オブジェクト指向を使った実装だと構文木を使ったものよりもだいぶ簡単になる(見通しがよくなる)んですけど・・・ 多少コード量(というかクラス・ファイル数)は多くなるんですけど、やっぱりインタプリタは旧来式の構文木を使った実装しかやらないんでしょうか。
何をしたいのかが伝わってないんだろう。 読んで、正規表現ライブラリを利用者に見せるためのAPIの話ではないの かも、という印象は持ったが、それ以上は考えるが面倒くさいのでス ルー。
もっぱら使う側が多いからじゃないのかな。特に不満もないし。。 鬼車のポジションを奪える可能性もあるからがんばって!
参考になるサイトもないでどうやって頑張るんだよ! 3日ぐらい悩んで大体めどがたってきたから別にいいけど。
要するにこういうことだろ。 いずれにしても、パターンの構文木()笑を作る必要はあるよ /(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")
途中で書き込んでしもた。めんどくせ
579 :
デフォルトの名無しさん :2009/01/22(木) 11:45:20
●正規表現の使用環境 prel ●検索か置換か? 置換 ●説明 特定タグ間のHTMLタグを全て削除する (<body>から</body>までのタグを全て削除) ●対象データ <html> <body> テスト<BR> <b>です。</b> </body> </html> ●希望する結果 <html> <body> テスト です。 </body> </html>
>>579 $html =~ s{(?<=<body>).+(?=</body>)} {
(my $body = $&) =~ s/<.+?>//gs;
$body;
}es;
581 :
デフォルトの名無しさん :2009/01/22(木) 14:08:55
>>579 のおかげで prel でぐぐっても perl が検索対象になることを知った
582 :
581 :2009/01/22(木) 14:11:05
ごめん、正確には prel 正規表現 など prel と何か別のキーワードでぐぐったとき prel は perl とみなされるっぽい
ワロタ
余談になるけど、VBSの正規表現は、処理系の実務にも耐えられるくらいの機能は持ってるよ。 条件判定としての正規表現を使える事は、VBAユーザーにとってこれ以上無いほどのメリットだと思ってる。 俺もそんなに正規表現は詳しくはないけど、エクセルで使う目的を考えると、VBSの正規表現は非常に使い勝手が良い。 良くも悪くもシンプルなんだよね。 仕事で文字列操作やRDBみたいな使い方してる人ならば、絶対に覚えておいて損はないよ。 後方参照が表現できるようになって、世界が開けました。 どうでも良い話かもしれないけど、マジでお勧め。
誤爆しました。すいません。
文字列の中から名前を取り出したいのですがどうやって書けば良いでしょうか
「名前」の定義は? 環境も。
588 :
586 :2009/01/28(水) 00:46:35
名前は人名です 環境はVB.NETです。
人名の定義は?
590 :
デフォルトの名無しさん :2009/01/28(水) 00:56:14
それを聞いてる
591 :
479 :2009/01/28(水) 03:07:22
形態素解析の領分だろうね。 どこまで固有人名を解析できるかは性能と元の文章次第だけど。
すまん、名前消したつもりが残ってた
辞書も必要だな
形態素解析までしなくても、日本全国の苗字と名前のテーブルを作って 「苗字+名前」で引っこ抜けばいいと思う
「あや」と「あやの」みたいのをどう 扱うかとか考え出すとなにげに難しい
英語と違って日本語は「わかち書き」をしないから難しいやろね。
(鈴木|佐藤|山田| ... )\s*(太郎|花子| ... )
>>586 よ、別に煽って遊んでる訳じゃないぞ。
コンピュータにとって、言うは易いが行うは難しい要求なんだ。
599 :
586 :2009/01/29(木) 01:12:20
レスありがとう では郵便番号か都|道|府|県|市|区|町|村のある行から 5行以内にある行で、末尾に。や、のない7文字以内の行で その行の中には、も。もない文字列 これを抜き取ったら名前の可能性が高そうなのですが どうやって書けば良いでしょうか
>>599 それは非常に喜ばしいけれど、名前じゃないものが抽出されたり、名前が抽出されなかった時に
どうするか考えてるの?
そのデータをどうやって作ってるのかよくわからんが、ごちゃごちゃしたテキストしか存在しないの?
人名で7文字制限つけていいのかなぁ。外国人名なんか来た日にゃえらいことになりそうだが。
>>599 正規表現ってのは、
人間が生活しながら身に付ける区別みたいに複雑な物じゃなく、
字面だけで機械的に振り分けする物。
それが可能なデータでないなら、正規表現での抽出は諦めた方がいい。
既存のデータなら仕方ないけど、何等かの方法で生成してる物なら、
その上流で手を打たないと難しい。
603 :
586 :2009/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) よろしくお願いします。
うざいので他所言ってください
とりあえず、「住所は必ず数字で終わる」のなら、 ^(\D+)\d で引っ掛けられそうか。
>>603 人名なんて住所より短いんだから、行頭から全角6文字以内+行末文字の抽出で十分じゃない。
はい終了。
まあそれでも半分ぐらいは抽出できそうだわな
609 :
586 :2009/01/30(金) 00:02:42
こんにちは とかが頭にある場合があるので郵便番号と都道府県のチェックは外せないです。
ネタじゃないの?
データごとの固まりは空行で区切られてたり 行数が決まってたりすんの? それだったら名前候補を抽出するプログラムも結構簡単に作れそうだが 全部正規表現でやるのは逆にむずそう
>>609 そのレベルになってくると、正規表現よりそれを扱うスクリプトの方でどうにかしたほうがいいのでは
そもそもどういう形式のデータかも想像できないし
613 :
586 :2009/01/30(金) 00:16:01
ネタじゃないです データは一つはj一人のデータです。 複数の人の切り分けは考慮する必要なないです。 やっぱ難しいですかね
>>613 いやもう本気で「日本語でおk」
どんなデータか説明してもらわないと、どうもこうも無いわ。
615 :
586 :2009/01/30(金) 00:44:15
わかりにくくてすみません。 自由なフォーマットで送られてくる住所氏名電話番号を ListViewに登録するということをやっています。 文章は こんにちは 私の住所は 123-0001 東京都**区**町10-10 日本太郎 03-0000-0000 です お返事ください。 こんな感じの文章から名前を出来るだけ高確率で取り出したいです。 段階に分けて調べた方がいいですかね 上の例だとまず郵便番号と都道府県と電話番号の位置を正規表現で探して それらに一番近い7文字の全角句読点なしを取るという感じでどうでしょうか 「です」が怪しいですね「になります」とか書いてあったら間違うし・・・
>>615 > 自由なフォーマットで
って時点で、正規表現の領域じゃないと思うぞ。
人名辞書と突合せしないと絶対に無理だろ
名前だけ抜き出すと考えるとまず無理 引っかからないのもNGだとすれば、全角と空白を一定以上含む行まで絞ってあとは目視しかない フリーフォーマットを許さないといけない特段の理由がないのであれば、フォームにするべき
出会い系?
っつーか、“理系”の人間に任せろよ。
つーかそこそこの確率でいいなら、漢字だけで構成されてる行を 抜き出すだけでよくね?
「できない」 ってハッキリ言ってやれよ。その方が質問主に対して親切だ。 こんなに引っ張るような事じゃ無いだろ。
だからネタでしょっていってんじゃん。 食いついたもん負け。
>>623 すると馬鹿は「知らないなら黙っててください」と言い出す
>>625 人のことを馬鹿呼ばわりするあなたにはわかるんですか?
わかる方のみ回答お願いします
628 :
586 :2009/01/30(金) 20:15:38
レスどうもです。 漢字の数文字の行から取るというのはいいと思いますが 折角正規表現が使えるのだからそれと郵便番号と住所なんかを手がかりにしたい (その分確率は上がるでしょうし)と思ったのでお力をお借りできないかと このスレを訪れてみました。 ご指摘の無理というお話もわかりますがm住所、郵便番号...の条件について、 正規表現で書く書き方を教えて頂けると助かったのですが 範囲の指定とか除外とか色々あって難しくて・・・ ちょっとアプローチを変えて自分なりの方法でやってみました。 住所、郵便番号、電話番号の位置を調べて、それの平均値を出して それに一番近い7文字の全角でかつ、。や、のない行 から文字を取るようにしたら結構良い確率で抽出するようです。 正規表現とは離れた手法になってきたのでこの件はこれで終わりにしたいと思います。 お騒がせしてすみませんでした。有意義な回答を下さった方ありがとうございました。
>>628 確実に除外できるものを削除しなよ。
そうすれば全部の名前に少しのゴミを加えたものになるよ。
まだ引っ張るつもりか
<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>)
/";
こんなので全然マッチングできませんでした
どこがまちがっているのか、おしえてください
>.\s. 任意の一文字+空白文字一文字+任意の一文字=計三文字 つまり"h1 class"とか"h1! ?class"とかじゃないと引っかからない。 h1とclassの間とかは「空白文字一文字以上」だから\s+でおk
>"h1 class" 2chの仕様でスペース一つに見えるけど、半角スペース三つね。
[ ]に | は使えないよ
質問なんですが、4桁の数字の頭にAという文字を付けたい場合、 [0-9][0-9][0-9][0-9]をどうやって置換すればいいんですか?
$str ='123b2345'; echo preg_replace('/[0-9]{4}/','A$0',$str); -- 出力結果 -- 123bA2345
正規表現関係ないじゃん…
638 :
デフォルトの名無しさん :2009/01/31(土) 14:38:44
>>632-633 助言ありがとうございます、.を取り除き進歩しました
今度は
$Pattern = "/([^<]h1*>[^a\s]*>)(.*?)(<\/a>)/";
のようにしてみたんですが、全然上手くいきませんでした
>>638 完全にスレ違いなので、お使いの言語のスレへいってくだしあ
640 :
635 :2009/01/31(土) 15:09:36
教えろ
642 :
デフォルトの名無しさん :2009/01/31(土) 16:42:28
教えられてもそれが答えと気づかなかったでござるの巻
645 :
デフォルトの名無しさん :2009/01/31(土) 17:38:44
ござる教えろ
答えを教えられていることを伝えたら答えを教えろと言われたでござるの巻
649 :
デフォルトの名無しさん :2009/02/01(日) 05:12:34
おしえろ教えろ
教えろおしえろオシエロ、、、エロ!?
そこでこざるの出番でござるよ
652 :
デフォルトの名無しさん :2009/02/03(火) 17:05:09
Perlの質問です。 .......<code>.......</code>...... ....<code>...........</code>...... こんな感じのドキュメントを、<code>または</code>の前で区切ってsplitで分けようとして 書きましたがうまくいきません。何が悪いのでしょうか。 @content = split( /(?=<(|\/)code>)/, $content);
>>652 たぶん空文字列や'/'が混じるのが御気に召さないのだろうと
思うがそれは君が (|\/) でキャプチャーしているからだよ。
いらなければ (?:|\/) とか \/? とかにするといい。
>>653 迅速かつ的確なアドバイス、ありがとうございます。上手くいきました。
意味はこれから勉強していきます。
655 :
デフォルトの名無しさん :2009/02/04(水) 19:03:45
お願いします( ゚ω゚ ) 言語はC#を用いています。 正規表現にて [ok] 100 [ng] 01 → 1 [ok] 0.001 [ng] 00 → 0 [ok] 0.1000 前ゼロ入力をReplaceで""に置き換えたいのですが、正規表現が上手く書けませぬ 教えてくださいエロい人
関口宏「ベジータさん、今までいろいろな敵と戦ってきましたね?」 ベジータ「ふん、ゴミに興味などない」 関口、リーダー『ゴミに興味などない』 ベジータ「な……なんだ貴様ら!?」 リーダー「そんなベジータさんにはこんな問題!」 関口宏「ベジータさんが戦った、ギニュー特選隊のメンバー、五人全員お答え下さいスタート!」 リーダー「走って!まだよまだよまだよどうぞ!」 ベジータ「ギニュー! グルド! えー……バータ! ……待てよ、ギニュー、グルド、バー……くそ、わからん! あっ、ザーボン! なにっ!? ドドリア! くそったれ! ギニュー! グル」 ブッブー! ベジータ「はぁ……はぁ……」 関口宏「リクーム、ジース」 ベジータ「あーリクーム……」
new Regex( @"^0+(?!\.)" ) でString.Emptyに置き換えてみたら でもこれだと000は""になっちゃうけど
658 :
デフォルトの名無しさん :2009/02/04(水) 21:22:25
>>655 C#の構文は知らないのですが、
/^0+(\d)/$1/
に相当する正規表現でどうでしょうか
659 :
デフォルトの名無しさん :2009/02/05(木) 10:33:34
>>657 >>658 ありがとう(・ω・)
でもダメですた(;´Д`)
^0+(?!\.) 開始0の入力が不可ですた
/^0+(\d)/$1/ $1がサポられてないですた
お騒がせして申し訳ありませんでした。
もう少しイジくり回してみます。
660 :
デフォルトの名無しさん :2009/02/05(木) 11:13:55
秀丸エディタでの正規表現です。 abcdefghijxyz abcdefg xyzdefabc から1行の中にabcとxyzの両方を含む行(1と3行目)を検索したいのですがどのように書いたらいいですか? (.*abc.*xyz.*\n)|(.*xyz.*abc.*\n) 上のように書くとできるのですが含む文字列を増やした場合大変そうです。 本来はどのように書くのでしょうか教えてください。 簡単に&のような文字があるんでしょうか。
661 :
659 :2009/02/05(木) 12:04:30
お騒がせしました(・ω・)出来まスタ スタ 解:System.Text.RegularExpressions.Regex(@"(^|(?=\.))0(?=[0-9])"); ありがとう御座いました。
>>660 ^(?=.*abc)(?=.*xyz).*$
テキストファイルの検索でファイル内に複数の単語があるかどうか検索するときには どういった感じにすればいいんでしょうか?
クラスの中でグループを使いたい場合はどうしたらいいですか? [123(456)] とした場合1/2/3/456にマッチする。
中じゃなく外でやれ。 ([123]|456)
なるほろろ
いやん。中に出して!
670 :
659 :2009/02/06(金) 18:08:08
>>667 悔しいけど感じちゃう ビクンッビクンッ
janeviewでwsh使用してますが、 2000にマッチして、DATE: 2000にはマッチしないようにしたいのですが どうしたらいいですか?
おっと、WSH か・・・ダメかもしれないね。 if文で2重チェックすればいいんじゃない?
>>675 そっちのが新しい文書やね。やっぱり (?<!・・・) は書いてない。
鬼車使えばいいじゃん
>>672-678 皆さんありがとうございます。
>>678 さん
いつのまにか鬼車ってやつに変わってたんですね
ヘルプの更新してなかったので気が付かなかったです。
鬼車にしたら
>>672 さんのやり方で出来そうだったんですけど、
なぜか、「正規検索のテスト」のウィンドウ上だとうまく出来てるみたいなんですが、
実際に「ログから検索」にかけるとDATE: 2000が掛かってしまうみたいです。(でもハイライトされない)
結局、検索を本文のみに絞るオプションを発見して一応望む結果は出せたのですが、
何故そうなるのか、どうもしっくり来ないです…
逆に(?<=DATE: )2000でログ検索かけてみると今度は全くマッチしない状態になります。
でもテストウィンドウ上ではちゃんとマッチするんですよね…。
なんかおかしい気がします。Janeのバグなんでしょうかね?
/[0-9][0-9][0-9].jpg$/
/[0-9][0-9][0-9]\.jpg$/
683 :
680 :2009/02/07(土) 20:52:29
わかりました感謝します
/\d{3}\.jpg$/
gawkの質問です。 村にはヒットさせたいが、川村とか大村とか村の前に特定の文字がついた場合にはヒットしたくない場合、正規表現ではどう書けばいいでしょう? /![川大]村/ とかでいいんでしょうか?
/[^川大]村/
ありがとうございました。
これだとただの「村」にはマッチしないんだよな
正規表現は難しいからね。これ自体が一つのプログラミング言語と同等だし。
いや、それはない
/[^川大]村|^村/ これはどうかね
後方一致 /(?<![川大])村/
gawkでって話だから戻り読みはなしだろう。
●正規表現の使用環境 サクラエディタ v1.6.4.0 ●検索か置換か? 置換 ●説明 「 xml:space=preserve>」を検索のキーとして キーを含む行末までの文を置換したい ●対象データ <string1 xml:space=preserve> </string1> <string2 xml:space=preserve> </string2> ●希望する結果 <string1/> <string2/> よろしくお願いします
s/<[^>]*xml:space=preserve>//g、でどうかな。
* で貪欲マッチするとマズいか。 最初の文字が x だから、 s/<[^x]*xml:space=preserve>//g、でどうだ。
697 :
デフォルトの名無しさん :2009/02/11(水) 13:40:25
>>694 s/<([^\s]+)\sxml:space=preserve>[^\n]+<\/\1>/<\1\/>/g
でどうでしょう。
698 :
デフォルトの名無しさん :2009/02/11(水) 13:44:59
s/<([^\s]+)\sxml:space=preserve>[^\r\n]+<\/\1>/<\1\/>/g 改行コードが文字コードによっていろいろなので少し修正 XMLが複雑な入れ子構造だとうまく動作しない場合がありえますが シンプルな構造で、閉じタグも同じ行にあるのなら大丈夫かも。 サクラエディタは持ってませんが()でのキャプチャは\数字で参照できるようですね。
699 :
デフォルトの名無しさん :2009/02/11(水) 13:47:57
s/<([^\s]+)\sxml:space=preserve>[^\r\n]+<\/\1>/<$1\/>/g こういう風にも書けるのかな
Perl互換の正規表現に対応しているソフトで ab cd を検索するのに /ab.cd/m と書いたのにヒットしません。 /ab.*cd/m も /ab\ncd/m もダメです。バグでしょうか?
>>700 そのソフトの名前を出してくれないならどこまで互換性あるのかわからないし
作者かユーザーに聞けとしか。
>>700 ほんとうにperl互換なら、s オプションをつければいいと思う。
/ab[\r\n]*cd/s
>>703 \r\nなのはWindows環境だからじゃないの?
それでもオープン時にテキストモード指定してれば\nでいいけど。
>>704 はい。窓です。正規表現の世界では異端なんですねw
そもそもそのデータはどうやって持ってきてるの? もしもデータがファイルにあって、ファイルオープンのコードを自分で書いたのなら そのパラメタが間違ってるよ。
>>706 OCRデータから目的のテキストだけを抜き出す作業です。
xdwファイルにOCRデータがありまして
…
氏名
西村ひろゆき
生年月日
…
というデータから名前を抜き出す作業です。
/氏名\n(.*)\n生年月日/m で抜き出せると思って試行錯誤したんですが、うまくいかなくて泣きついた次第です。
ファイルオープンのコードをかくという作業はありません。というか、低レベルなのでそういう高度な作業はよくわからない状態です。。。
>>703 もし、正規表現を使い始めたばかりなら、詳説正規表現はまだ読むべきじゃない。
読むならまず入門書から入るべきかと。
>>708 ありがとうございます。たしかに自分には早いのではないかという気がしていました。
はっきりと断言していただきありがとうございます。初心者用の教科書をAmazonで探します。
もしもお勧めがあれば、ご教示いただけましたら幸いです。希望ばかりで大変心苦しいのですが。。。
>>705 行の末尾がOSによって異なるんだよ。
\n だけのOS(うにくす系)
\r だけのOS(りんご系)
\r\n 両方必要なOS(まど系)
(ここまでは、パソコンの基礎知識)
この3種類に共通に使えるように
[\r\n]*
って書くんだよ。
(これは正規表現の応用問題。よく使う慣用句みたいなもの)
自分はPerl本から入ったクチだけど、
>>709 の場合、
Perlの処理部分については必要ないよね、おそらく。
特に正規表現に関して言うなら、試行錯誤して身につけたものの方が多い。
一番参考にしたのは秀丸のヘルプだったりする。
だから本を買う前に、Googleで正規表現を検索して、トップ30ぐらいまでの
ページを順に読むほうがよいかと。
テキストエディタでの正規表現の利用方法を記載しているものもあるけど、
それらも基本は同じだから、まずそこでイメージを掴むべきかと。
本を買うのは、その後。、少しでも自分のイメージができた後で書店で中身を
確認して買うべきだと思う。
最近のテキストエディタは検索結果に一致する箇所にマーカーをするものもあるから、
それで勉強するのもベストかと。
自分が知っている分では秀丸とSakuraエディタ。それ以外にもあるとは思う。
713 :
694 :2009/02/11(水) 21:33:37
>>695-699 お答えいただき、ありがとうございました
早速試してみたのですが、検索に引っかかりませんでした…
714 :
デフォルトの名無しさん :2009/02/11(水) 22:57:49
>>713 サクラエディタを使ったことないので、サクラエディタでの置換方法は分からないのですが
<(\S+)\sxml:space=preserve>[^\r\n]*<\/\1>
で検索にヒットしないでしょうか?
あとは、それを
<$1\/>
に換えるだけですむのですが・・
715 :
デフォルトの名無しさん :2009/02/11(水) 22:59:51
714では、 [^\r\n]+ を [^\r\n]* にしました
っつーか、
>>695 のsed式での回答ってどうなんだろう?
個人的には、環境に左右されないからアリだと思うんだけど。
スラッシュで囲むっていう知識は前提にしていいのかな?
717 :
694 :2009/02/12(木) 01:29:13
>>714 出来ました!ありがとうございます!
しばらく頑張ってたのですが、どうにもうまくいかず参ってたところでした
本当にありがとうございました!
>>716 まあ正規表現だってのをはっきりさせるのはいいと思うけど、
スラッシュ以外も区切りにできる(できないのもあるけど)というのを
知らない人がさらに増えるようなきがするのはやだなあ。
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> を試してみたのですが、これもうまくいきません。 角カッコの中は丸カッコで囲んでも無視されて一文字ずつに分解されてしまうようです。 どうすればいいんでしょうか?
>>720 *や+は最も長く貪欲にマッチしようとするから、最後の</div>にマッチする。
*や+の直後に?を付ければ最小マッチになってできる限り短くしようとするから
望むような結果になるはず。
JavaScriptならDOMで操作しないさいよ…
>>721 おおおおお!まさにこれを求めていました!
いろんな場面で使えそうでとても助かります。どうもありがとうございます。
>>722 それがGM_xmlhttpRequestで得る値なので、全部テキスト形式になってしまうのです。
phpで正規表現を使うかプログラムでゴリゴリ書くか迷ってます やりたい事は、見出し語:[発音,][定義1][,"例文1","例文2",...][ *注記][; 定義2...]みたいな テキストを分解して各(配列)変数に設定する、みたいな事なのですがpreg_match_allみたいな関数で この程度なら実現可能そうでしょうか? 既に結構時間を使ってるので見込みが無さそうならサッサと見切りを付けたいのですが…
全部ちゃんと分割できるよ
うっ…出来るんですか。(まだ定義の分割すら碌に出来てない…) もう少し頑張ってみます
[*]の[]を普通の文字として扱いたいときどうすればいいんですか? \[*\]だと無理ですよね
ふつうは \[*\] でいいんだよ。ふつうは。
そうですか・・・ \[*\]だと]しかクォートされないので・・・
[[]*\]
やはり]だけでした
それをどうやって確かめてるんだ
アナログ放送をIEPGで登録すると[S]や[字]といった文字が名前に付きこれが邪魔なのでリネームしたいんです たとえばファイル名[S][字].avi s/\[S\]// してやるとファイル名[字].avi となりますが s/\[*\]// とするとファイル名[S[字].avi といった感じになります
>>733 頭悪いのに勝手に自分で問題を切り分けずに、最初からそれをいえよw
*の使い方しらべとけ
わからないんですね すいません
「頭悪い」なんていきなり何様ですか わからないならわからないと言えばいいじゃないですか
どっからどう見ても最初に質問した奴と途中の奴が別人w
s/\[*m9(^Д^)\]//
s/\[..*\]//
740 :
デフォルトの名無しさん :2009/02/14(土) 23:26:05
>733 横レス失礼します。 s/\[[^\]]*\]//g これでどうでしょうか?
741 :
デフォルトの名無しさん :2009/02/14(土) 23:33:42
>>733 s/\[.*?\]//g
これでも大丈夫でしょう。
最短マッチに対応している正規表現エンジンの場合は。
*や+は条件に合致しつつできるだけ多くの文字を消費するような選択をします。
*?、+?は最短マッチといって、その条件を満たす最短の場合が選ばれます。
想定される用途では否定の文字クラス [^いろいろな文字] を使うか
最短マッチの .*? を使われると良いとおもいます。
別の表現なら否定先読み (?!文字列) をつかっても長くなりそうですが書けます。
ご参考になれば幸いです。
>>733 最初からそれを書け。
コミュニケーション能力不足。
人間相手にコミュニケーションできないで
コンピュータ相手のコミュニケーションが出来ると思うのか?
s/\[[S字]\]//
743 :
デフォルトの名無しさん :2009/02/15(日) 15:20:54
補足です。
>>741 の正規表現は*の前に見づらいかもしれませんがピリオド.があるのでご注意ください。
>>733 の正規表現 /\[*\]/ にヒットする文字列はたとえば
]
[]
[[]
[[[]
[[[[]
[[[[[]
になります。
いくらなんでも初歩で躓きすぎだろ 質問に無関係な知識押し付けてる方もひどいが
キラーパスだな
++とか(?>)とかのpossessive quantifierってどういうときに使ったっけ? あれば便利そうは気はするし、実際なんかで使った記憶はあるんだけど思い出せない
わからないから聞いてるならまだしも、忘れたから聞いてるってのはそれこそググレば?
750 :
デフォルトの名無しさん :2009/02/19(木) 20:45:50
すいません質問させてください @/home/test/hoge/test/test.txt A/home/test/hoge/test/document.txt ↑のパスがありまして、そこからtestで検索をすると @のtext.txtのみが該当する正規表現ってうまく出来ないものでしょうか? ファイルまでの途中のパスは含めないで最後のスラッシュ後のファイル名のみ 検索対象としたいのですが悩みまくりです・・・ イメージ的にはエディターでの正規表現で@のみ該当させる感じです。 どなたかご教授願えないでしょうか?
C#を使っています string か strin か stri か str か st か s にマッチするパターンを今は↓のように書いているんですが ^s(t(r(i(n(g)?)?)?)?)?$ もっと分かりやすい書き方ってありますか?
>>750 /([^\/]+\/)*(.*)/ で、\1がパス、\2がファイル名。
>>750 秀丸エディタなら↓これでいけた。他は知らん
(?<=.+/)test
755 :
デフォルトの名無しさん :2009/02/19(木) 22:57:56
756 :
デフォルトの名無しさん :2009/02/19(木) 22:59:13
>>750 少し修正
test\.txt[\r\n$]
ひどくなってるYO
test\.txt(?=$|\b|[\r\n])
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]+=)['"].*\} の(.*,|)の意味するところがわからない。 ↑ |って○○か××を意味するメタ文字じゃないの?なんで)の直前にあるんだろう?
(foo|) は (foo)? と同じ意味では。
.*0か1個以上ある?じゃあ.+と同じ?
はあ?
763 :
750 :2009/02/20(金) 08:57:02
みなさんレスありがとうございます 例えが悪かったですが実現したいのはデスクトップの検索エンジンでのファイル名検索でファイル名のみで検索したいのです。 みなさんのレスを参考に思考錯誤してみます
>>759 "t": "([^"]+)"
俺は、これで済ませてるw
すみません(foo)?の意味がわかりません教えてください
>>764 それでいけるよねw
>>751 C#なら
s.Length > 0 && "string".StartsWith(s)
のようにやればいいのに。
女のコの性器表現てどれくらいの種類があるんだろう
単語だけならともかく、そんなのは文脈によって変わるし、 『×××』だけでもそれを表すことができる上に、『大事なところ』などボカした表現までスコープを広げると とても現代の正規表現で賄いきれるものではない。 言語学の分野で議論してくるがいい。
C#でWBCかワールド・ベースボール・クラシックのどちらかを含み、かつイチローか松坂のどちらかを含むline、と正規表現で if (Regex.Match(line,"(WBC|ワールド・ベースボール・クラシック) && (イチロー|松坂)").Success) と書いてみたのですが、いまいちうまくヒットしないです。アドバイスお願いします。
正規表現の中に && とか画期的すぎるだろ・・・ テンプレの正規表現講座でも見ておいで
771 :
751 :2009/02/24(火) 22:56:03
>>766 確かにその方がわかりやすいですね
ありがとうございます
if (Regex.Match(line, "(WBC|ワールド・ベースボール・クラシック)").Success && Regex.Match(line, "(イチロー|松坂)").Success) でいいんじゃね?C#知らないけど。 AND増えるなら条件を配列に入れてループで。
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
>>772 Regex.Match の使い方が間違ってる。ちゃんと説明書読んだ?
C#知らないと言っている人にそんな指摘してもなあ
C# カンケーない。Regex.Match の使い方が間違ってる。
>>769 >>772 if (Regex.Match(line, "WBC|ワールド・ベースボール・クラシック").Success && Regex.Match(line, "イチロー|松坂").Success)
で良いが、IsMatchのほうが良さげ。
if (Regex.IsMatch(line, "WBC|ワールド・ベースボール・クラシック") && Regex.IsMatch(line, "イチロー|松坂"))
少しお聞きします。 1hage(100禿) 1hage(10毛) 1hage という文字列があった場合に、1hage(100禿)以外をマッチさせたいのですが、 なかなかうまくいきません。 どのように正規表現を書いたものでしょうか?
779 :
778 :2009/02/27(金) 19:34:25
>>778 すいません。追記です。
具体的には、"hage"をヒットさせたいのですが、"禿"を含むもののみマッチさせないようにしたいのです。
1hage にマッチしたものから 1hage(100禿) にマッチするものを取り除く、 じゃダメなのか? どうしても1個の正規表現でやんないとダメ?
>>780 うん、やっぱりそれの方がスマートでよいですよね・・・
わかりました。
無理に正規表現だけでやらないとことにします。
ありがとうございました。
文章中に「A」と「AA」が混在していて、 1文字だけの「A」を2文字の「AA」にします。 2文字以上連続していない、1文字だけの「A」は どうやったら探せますか? /A{1}/ でも駄目ですし、/A[^A]/ だと 行の中に A しかない物が引っ掛かりません。
D:\jspsh>jspsh.exe js> "A AA AAA".replace(/(^|[^A])A([^A]|$)/g, "$1AA$2") AA AA AAA js> :q Leaving "JScript Power Shell"
タイ━━━━||Φ|(|´|Д|`|)|Φ||━━━━ホ
/(?<!A)A(?!A)/
<A href="○○○○○○○">●●●●●</a> と <A href="○○○○○○○"><hogehogetag>●●●●●</hogehogetag></a> という文字列から●●●●●を取り出したいのですが どうやって書いたら良いか教えてケロ 決まってるのは<A href="○○○○○○○">の次の<>の外の文字列ということです。
789 :
デフォルトの名無しさん :2009/03/12(木) 17:29:29
「から最初の」までってどうやって抜き出すんですか?教えてください
「[^」]*」
ありがとうございました
792 :
デフォルトの名無しさん :2009/03/13(金) 00:14:55
SQL(SELECT、UPDATE、INSERT、DELETEが不明)から、 テーブル名をマッチさせる正規表現が解る方、どなたかいらっしゃらないでしょうか? ひとつの表現で不可能なら、複数でもいいのですが…(´・ω・`)
SQLの構文解析は正規表現じゃ無理
794 :
デフォルトの名無しさん :2009/03/13(金) 01:07:40
金額の文字にマッチするにはどう書けばよいですか? 123,456,789 ←こういうの
\d{1,3}(,\d\d\d)* かな
複雑な正規表現のテストってどうすればいいんだろうね。 自分に都合のいいデータだけ作ってやってるけど。 実際は何が起こっても仕方ない場合が多いのだが。
製品名を「鼻から悪魔」にしておけば何も問題は無い
>>796 私も以前、このスレではない所で同様の質問をしたが、真面目な答えは
返ってこなかったよ。正規表現から見るとプログラムテストは鬼門かもね。
複雑なC言語プログラムのテストってどうすればいいんだろうね。 自分に都合のいいデータだけ作ってやってるけど。 実際は何が起こっても仕方ない場合が多いのだが。 複雑なjavaのテストってどうすればいいんだろうね。 自分に都合のいいデータだけ作ってやってるけど。 実際は何が起こっても仕方ない場合が多いのだが。 複雑なPHPのテストってどうすればいいんだろうね。 自分に都合のいいデータだけ作ってやってるけど。 実際は何が起こっても仕方ない場合が多いのだが。 複雑なバッチファイルのテストってどうすればいいんだろうね。 自分に都合のいいデータだけ作ってやってるけど。 実際は何が起こっても仕方ない場合が多いのだが。 複雑なExcelマクロのテストってどうすればいいんだろうね。 自分に都合のいいデータだけ作ってやってるけど。 実際は何が起こっても仕方ない場合が多いのだが。 ・・・正規表現に限った話ではない。 >自分に都合のいいデータだけ作ってやってるけど。 問題の原因がハッキリわかってるじゃないか。それを対処すればいいじゃないか? 自分に都合のいいデータを作ってしまうのが問題なら、他人にデータを作ってもらえばいい。
>>796 やったことはないが、本気でやるなら、こんな感じになるんだろう。
1.マッチすべきパターンについて構文木を作る
2.構文木を元に直交表を作る
3.実験計画法でテストケースを作る
4.テストケースをテストプログラム化する
>>799 プログラム言語の場合はステップごととか、プロセジャーや
関数に分割してテストするし、型も助けになる。
正規表現の対象としているのは文字列でここから先は構文解析
しかない。複雑な組み込みシステムの入口、出口でどんな
テストデータを用意すればよいかというのと類似した問題だ。
http://www.honya-town.co.jp/hst/HTdispatch?isbn_cd=4062574993 上記の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>"のようにしたのですがこれだとひとつもマッチしてくれません
どのようにするべきなのでしょうか?
あれ、書 名 の部分は実際は書&nbsp;&nbsp;名です(&=>&)
自己解決しました 「.」は\nを含まないのでだめだったようです "書.*?名.+?\n.+?<strong>(.+?)</strong>"でいけました スレ汚しすみませんでした
JavaやC#に正規表現のコンパイル機能があるけど、あれって意味あるのかな? いつも可読性を優先してRegex.Match(data,pattern)みたいに直接使ってるんだけど、 コンパイルが必要になるほど性能が必要な正規表現ってどんなのがあるん?
>>805 一般論的に正規表現のコンパイルというと、何度も同じ正規表現を
使うときに差が出る。
それが有意な差になるかはプロファイル取ってみないとわからないけど。
ところで可読性なら生の正規表現よりも定数とかに入れて
名付けた方がいいんじゃない?めんどくさいけど。
>>805 perlでo使ったらうれしいときと同じだよ。
>>806 >ところで可読性なら生の正規表現よりも定数とかに入れて
>名付けた方がいいんじゃない?めんどくさいけど。
コード体系とかのパースの場合は定数化してるよ。
"Key: Value"なデータのパースとかはハードコードかな。
わざわざファイル移動で確認させる価値もないし。
ルールを変更可能にするため外部化、ってのもよくあるパターンだと思うけど。
810 :
デフォルトの名無しさん :2009/03/26(木) 17:50:58
hoge.out.csvを引っ掛けないで、mage.csvやhage.csv を引っ掛けるにはどう書いたらいいんでしょうか? .*\.csvを引っ掛けたいのですが、.outが含んでいるときはだめ、という形です。 /[\w\0-9]+(?!\.out)\.csv/ みたいに書いてみたのですが、.out.csvも.csvもともに引っかかってしまいます。
812 :
810 :2009/03/26(木) 19:59:19
>>811 ありがとう。
結局こんな感じで行けました。
/^[^\.]*(?!\.out)\.csv/
>>812 それ単に.csv以前に「.」を含まないものにマッチだから、
hoge.hoge.csv
はマッチしないけどそれでいいの? .outは含んでないよ。
>>812 否定先読みはきちんと理解出来てる?
もう一度パターン眺めてみると良いかも。
815 :
デフォルトの名無しさん :2009/03/29(日) 11:05:44
すみません、似た質問になるのですが ファイル名が1行の中に列挙されていて たとえば、hoge1.zip hoge3.zip hoge5.exe のような場合に 行中に .zipでない拡張子が含まれるという条件にマッチする正規表現は可能でしょうか。 ファイル名の区切りは、スペースを仮定します。
.+\.(?!zip).{3} こんな感じ?拡張子は3文字として決め打ちしてるけど。 ファイルとファイルの間にスペースがあるなら、スペースまでのマッチに工夫すれば良いと思うよ。
vbsです。 1.txtを\dでマッチさせようとしているのですが、 01がマッチしてしまいます。 a.txtを\Dで待ちさせようとすると 0aがマッチしてしまいます。 どうして2バイトになるのでしょうか?
確認方法が間違ってるんじゃね?
●正規表現の使用環境 .NET 1.1 (C#) ●説明 テキストボックスに入力された文字の最後が 大文字小文字関係なく .csv と入力されているか 判断したいです。 if (textBox1.Text.EndsWith(".csv")) とすると、小文字のcsvでないとTRUEを返してくれません。 .NET2.0以上なら、EndsWith(".csv", 大文字小文字無視) のように書けるのですが、1.1だとそのメソッドがありません。 恐れ入りますが、ご教授おねがいします。
素直な方法が使えないなら、多少は面倒だけど うしろから4文字を取ってきて、小文字化してから".csv"と比べるとか。
>>821 あっ、その方法がありましたね。
自分の頭が固かったです。
文字列を一旦小文字にしてから
比較することで無事解決できました。
どうもありがとうございました。
何にもマッチしない正規表現というのは表現可能でしょうか? どのように記述したものでしょうか?
否定先読みで全ての要素を否定してるから、何にもマッチしないって事だね。 良いんでない?
/xxx/sss/ccc/fff/ggg/aaa.txt と言う感じで任意の回数スラッシュが出てくるんですが、一番最後のスラッシュ だけをsedで "/"→"/tmp/"に置き換えたいんです。 正規表現を使って置換可能でしょうか?記述が全く思いつきません、、、
>>826 s/(\/[^/]+)$/\/tmp\1/g
否定先読みでマッチさせてもいいかもね。
というか、一番最後のスラッシュっていう条件はまだ甘い方だと思うんだけど。 全く思いつかないってのは単に勉強不足じゃない?
831 :
826 :2009/04/08(水) 00:19:51
マッチっていう意味ならスラッシュのある一行全体にマッチしてる。 で、最初の括弧が\1、次の括弧が\2としてマッチ。 というか\2の辺り削ってもいいんじゃないかと。 s/(.*)\//\1\/tmp\//g
833 :
826 :2009/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 :
デフォルトの名無しさん :2009/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の修正。 これが動作しません :2009/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 :
デフォルトの名無しさん :2009/04/08(水) 02:14:16
検索しようとする文字列に、特定の文字が含まれている場合、 デミリタを「/」以外にするとバグるようなんです。 しかし、検索しようとする文字に「/」が含まれている場合は別のデミリタを使うしか無く困ります。
837 :
デフォルトの名無しさん :2009/04/08(水) 02:40:05
サクラエディタで検索してもバグらないし、ソースコードみても回避方法わからなかった
>>833 最大マッチと最小マッチの差じゃない?
sedは知らんけど
839 :
836 :2009/04/08(水) 04:27:12
次の文字でバグりました。 40 41 42 43 63 91 92 129 EUC全角カタカナ「リ」
そりゃエスケープせんと。例えばasciiの40って、'('じゃないか。
841 :
836 :2009/04/08(水) 05:14:28
特殊文字はわかりました。しかし「リ」を含む文字でも間違えるんです。 検索対象には含まれていないのに、含まれているとなるんです。
どう間違えているか判らんが、cp932対応のエンジンにeucを食わせたらそりゃぁ、混同するさ。
843 :
836 :2009/04/08(水) 08:09:39
BREGEXPってバイナリの正規表現が出来るとおもってた。 Bは馬場さんのBでバイナリではなかったのか。
844 :
836 :2009/04/08(水) 08:16:09
書いてありました。 5.制限事項・注意事項 Oniguruma 自体は各種文字エンコーディングに対応していますが、 bregonig.dll は Bregexp.dll との互換性のため、ASCII と Shift_JIS 以 外の文字エンコーディングは使用できません。
845 :
鬼車を弄くった。これで任意の文字でいけるだろうか :2009/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 :
デフォルトの名無しさん :2009/04/08(水) 10:37:09
845だと多バイト文字は識別しないはずなので、バイナリ文字列の正規表現がいけるはずです。 うちの環境ではEUCの文字でバグっていたところも問題でなくなりました。 Bfindは、ptnを検索して、見つかった先頭アドレスを返します。 Bpickは、正規表現にマッチした文字列をstrにセットします。
>>839 >EUC全角カタカナ「リ」
2バイト目は0xEAだから、Shift_JISの1バイト目として解釈されてその次の1バイトが
デリミタとして扱われていない。
そういう変なバイト列を検索したいのなら、\xHH形式を使えば?
findstr="\\x2F\\xA5\\xEA";
そういうことか 納得
スレ違いです
>>849 URLだかURIのRFCに正規表現がそのまま載ってた覚えがあるぞ。
はあ?
>>849 “ホスト名”の定義があいまい
トップページへのアクセス先を取りたいということの場合に
sub.example.jpに対してトップはexample.jpではなくmain.example.jpだったら?
FQDNを抜き出すということなら自分はこうする
([^:/]+)(?=\/)
856 :
855 :2009/04/11(土) 14:33:51
先頭に://と@の扱い入れるの忘れたや
ポートの事も、たまには思い出してください。
法令の条文の漢数字を算用数字に置換する正規表現を教えてください。 たとえば、 第一条 → 第1条 第十一条 → 第11条 第三十四条 → 第34条 第百条 → 第100条 第百二十三条 → 第123条 第三百二条 → 第302条 第千三条 → 第1003条 第千二十三条 → 第1023条 等です。ついでに、 第二百五十六条の二 → 第256条の2 第二百五十六条の二の一 → 第256条の2の1 なんかも置換できれば大変うれしいです よろしくお願いします。
そりゃ正規表現だけじゃ無理だべ。 なんらかの言語の支援がないと。
「なんば君」HELP で検索。
なんで正規表現でやりたがるのか理解できない
魔法の呪文 正規表現
>>861 「なんで」うんぬん
たとえば、テキスト・ファイル中に
「まったく正規表現とは関係ないが、民事訴訟法第123条第2項は美しい!」
とかあった場合に、その行にカーソルをおいて特定のキーを押せば、
民事訴訟法第123条第2項の条文がポップ・アップで表示できるEmEditorの(Javascriptもどきの)
マクロを作って使用しているのですが、模範六法のCD等から落としたファイルの条文は
算用数字なのに、Webページで公開されている条文のなかには漢数字のものが多いので、
それを利用したいな、なんて思ったたわけです。
貴兄たちの異常な才能を信じてお願いしてみました。
そういう意味の「なんで」じゃ無いやろw
>>863 それは貴方の求める機能の目的であって、
そこに正規表現を使う理由にはならないでしょう?
およそ正規表現が引き合いに出されるような要求では無いように思いますが。
>>865 私が作ったマクロが正規表現で条項の検索をしているので、
そこのところを置き換えるだけですめばわたしにとって便利だ
という、たんなる自己中理由でした。
みなさんに不愉快な思いをさせたみたいですみません。
だから、何故正規表現云々の前に自分の環境を提示しないの? 馬鹿なの? 日本語学習中なの?
872 :
デフォルトの名無しさん :2009/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
そういうのは正規表現の仕事ではありません
874 :
872 :2009/04/13(月) 23:22:10
>>873 了解です、できないと事がわかったので感謝します
たしかに ....replace(/^N\d+/, "N" + n); n += 10; のようにやるよりは { $1 = "N" (10 * NR); print } の感じのほうがいいな。
876 :
taguti :2009/04/14(火) 14:41:40
6個のreal型変数x1、y1、x2、y2、x3、y3を定義しそれぞれに実数つを読み込んで、xy平面上の3点 (x1、y1)(x2、y2)(x3、y3)を頂点に持つ三角形の面積を計算して、その値を表示するプログラムを作成してください。 ・公式:底辺x高さ÷2を使って計算してください。 お願いします!!
それを正規表現でやるのか
包茎が治る正規表現を教えてください。 先っぽの皮が余ってしょうがないんです。 お願いします!!
>>879 すれ違いだけど
俺もそれ学校の問題で出されたことある。
定番かな。構造体使うC言語の問題で。
はっきりいって、三角形の公式使わないほうが楽だよね。
一点を原点移動して例の公式を適用するのが一番シンプルだと思う。
何と戦ってるんだろう
884 :
デフォルトの名無しさん :2009/04/16(木) 12:31:02
885 :
デフォルトの名無しさん :2009/04/16(木) 13:25:44
>>881 ヘロンの定理
イラナイだろ
とんち問題だよ
886 :
デフォルトの名無しさん :2009/04/16(木) 13:39:16
いや、どう考えてもプログラミングしてくれってのがおかしいだろ。 正規表現のスレで出る話題じゃない。
888 :
デフォルトの名無しさん :2009/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; }
ヘロンの公式キターーー
>>888 こういう一見親切そうな行動をする人間が、世の中のすべてを駄目にする。
ヘロンの公式とかこの問題を解くのにふさわしくない
892 :
デフォルトの名無しさん :2009/04/16(木) 20:36:33
893 :
デフォルトの名無しさん :2009/04/16(木) 20:38:14
性器表現できません><
行列式でも出るよ さあ誰か書け
896 :
デフォルトの名無しさん :2009/04/16(木) 22:04:04
↑お麻衣が書くニダ
897 :
デフォルトの名無しさん :2009/04/16(木) 22:17:53
>>876 >それぞれに実数つを読み込んで
ココ
とても難しい
どこから?
どうやって?
それで
乱数で与えてみる
898 :
デフォルトの名無しさん :2009/04/16(木) 22:44:34
ヘロン公式は √を使うから 誤差はどう?
899 :
デフォルトの名無しさん :2009/04/16(木) 22:49:03
900 :
デフォルトの名無しさん :2009/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 :
デフォルトの名無しさん :2009/04/16(木) 23:02:20
902 :
デフォルトの名無しさん :2009/04/16(木) 23:13:33
/*倍率*/ M=1000; // 変更
言語Perlです。 あるCのソースから構造体(typedefも)を抽出したいのですが、 この例のようなstructやunionを含んでるstructを マッチさせるにはどう書けばいいんですか? struct A{ unsigned short a; unsigned long b char* c; struct{ long e[8]; long f; }d; };
904 :
デフォルトの名無しさん :2009/04/16(木) 23:24:21
↑一旦文字変換してから matchさせると良い
905 :
デフォルトの名無しさん :2009/04/16(木) 23:29:33
-21761253.57183114 8544355.772346469 61664545.39556769 62137654.31616132 79934094.82325418 66218011.1129441 659766221291321.5 319359195447661.56 340407025843659.94
906 :
デフォルトの名無しさん :2009/04/16(木) 23:47:31
たとえば? data=list*->A.c; if(data.match(/.*/)){ }
907 :
デフォルトの名無しさん :2009/04/16(木) 23:48:55
x=(79934094.82325418)-(-21761253.57183114); y=(66218011.1129441)-(8544355.772346469);
>>903 >この例のようなstructやunionを含んでるstructを
一般に、任意にネストできる構造は正規表現で照合できない
(実は、「Perlの」正規表現ではできてしまうけど、ごちゃごちゃしたものになるので
オススメしない)。正確に抽出したいならCのパーザを自前で書くか、どっかからCのパーザ
拾ってくるのが良い
909 :
デフォルトの名無しさん :2009/04/17(金) 00:22:26
簡単な検証方法 <center><script> var x1, y1, x2, y2, x3, y3; var a, b, c, s, S; var S1,S2,M,N; /*可変*/ 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=-N;N>=i;i++){ // 数値を自動代入 x1=0; y1=i; x2=-1; y2=0; x3=1; y3=0; a=Math.abs(x1-x2)*Math.abs(y1-y2); // 底辺x高さ÷2公式による面積の計算 b=Math.abs(x2-x3)*Math.abs(y2-y3); c=Math.abs(x3-x1)*Math.abs(y3-y1); 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)/2; 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>
910 :
デフォルトの名無しさん :2009/04/17(金) 00:28:10
911 :
デフォルトの名無しさん :2009/04/17(金) 00:44:36
perl5.8.8を使用しています。 <td>タグの中身を取得したいのですが、ネストしている場合は、 内側のタグのみを対象としたいです。 そこで否定先読みで<td>と</td>の間の文字列でかつ、"<td>"に続かない ものにマッチするという正規表現を書こうとしています。 現状では以下のような感じです。 $_ =<<DATA; <td>データ1</td> <td> <tr> <td>データ2</td> </tr> </td> DATA # 内側のテーブルタグのみにマッチさせたい @res = /<td>(?![\s\w<>]+?<td>)[\s\S]+?<\/td>/gm; # こっちはOK #@res = /<td>(?![\s\S]+?<td>)[\s\S]+?<\/td>/gm; # NG 分からないのはNGと書いた方が上手く動かない理由です。 現象としては、否定先読み条件の中の最短マッチが適用されていないように思います。 上の例ですと、データ2のみが取得されてしまいます。 修正方法を教えていただけないでしょうか。
912 :
デフォルトの名無しさん :2009/04/17(金) 02:14:58
↑ [\s\S]って . と同じ?
913 :
デフォルトの名無しさん :2009/04/17(金) 02:36:13
>>911 ⇒
>>910 サンプル
<center><script> var x1, y1, x2, y2, x3, y3; var a, b, c, s, S; var S1,S2,M,N;
/*可変*/ N=1000; P='';
P+=('<style>td,th{font-size:10;} </style><table border=1><tr>');
P+=('<th>x1 </th><th>y1 </th><th>x2 </th><th>y2 </th><th>x3 </th><th>y3 </th>');
P+=('<th>底辺x高さ÷2公式<br>による面積計算結果 </th>');
P+=('<th>ヘロン公式による<br>√を使った面積計算結果 </th>');
P+=('<th>問題となる誤差<br>倍率'+M+'倍 </th> </tr>');
for(i=-N;N>=i;i++){ // 数値を自動代入
x1=0; y1=i;
x2=-1; y2=0;
x3=1; y3=0;
a=Math.abs(x1-x2)*Math.abs(y1-y2); // 底辺x高さ÷2公式による面積の計算
b=Math.abs(x2-x3)*Math.abs(y2-y3);
c=Math.abs(x3-x1)*Math.abs(y3-y1);
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)/2; 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;
P+=('<tr><td> '+x1+' </td><td> '+y1+' </td>'); // 計算結果と誤差を表示
P+=('<td> '+x2+' </td><td> '+y2+' </td><td> '+x3+' </td><td> '+y3+' </td>');
P+=('<td> '+S1+' </td><td> '+S2+' </td><td> '+(S1-S2)+' </td></tr>');}P+=('</table>');
data=P; data=data.replace(/(<td>)([^<>]*)(<\/td>)/g,'$1 消去$3'); document.write(data);
</script>
914 :
デフォルトの名無しさん :2009/04/17(金) 02:37:52
>>911 これを参考に・・・
data=data.replace(/(<td>)([^<>]*)(<\/td>)/g,'$1消去$3');
915 :
デフォルトの名無しさん :2009/04/17(金) 02:51:50
>>895 せっかく
>>876 を行列式で書くなら
3D空間で同様に書いてみたら?
つまり宇宙的規模と言う事です。
(x1,y1,z1) (x2,y2,z2) (x3,y3,z3)
916 :
デフォルトの名無しさん :2009/04/17(金) 02:54:13
>>912 同じといえば同じ。
ただし、. と違って常に改行にもマッチする。
否定形で使うと何ともマッチすることのないものになる。
>>911 は [ ] の意味を知らないんだろ。( ) と間違えてるヤツ多いよね。
>>917 〜以外はなんとなく . が母集合だと思ってた
言われてみれば文字全てが母集合になるのが当然だよなぁ
>>918 ( )にキャプチャとグルーピングの両方の意味を持たせたのは失敗だとよく思う
(?: )と逆ならもうちょっとマシだったろうに
ついでに気づいたけどFx3で\bと[\b]が別物なのはおもしろいな
>[\b] バックスペース (backspace) にマッチします。 ( \b と混同しないでください。)
920 :
デフォルトの名無しさん :2009/04/18(土) 02:53:33
921 :
デフォルトの名無しさん :2009/04/18(土) 03:45:58
改行を識別して、文字数を取得したいのだけど。 いつも、文字数が何カチが手t場ぐるの。 助けてくれたらエッチしてあげてもいいよ
[ぁ-ん]+ で書きなおしてくれ。何言ってるかわからん。
エッチとかぁーんとかエロティックなスレだな
>>921 環境が判らんと何とも言えんが、ascii以外の文字数を数えようとしているのならエンコーディングがあっていないとか。
<em onclick="">aaa</em>、ほかのHTMLタグに一致するような正規表現を考えてるのですが、スマートな表現が見つかりません。 <(a|b|i|....)+.*>などのように禁止したいHTMLタグを並べるのは非常にめんどうです。 スマートな表現があったら教えてほしいです。
>>925 追記:PHP 5.2.9.9を使用しています
927 :
デフォルトの名無しさん :2009/04/23(木) 13:45:51
ABC DEF GHI ABC GHI JKL DEF GHI JKL 上記の文で"ABC"が含まれている行の "GHI"だけをマッチさせたいのですが うまくできません、教えてください 使用環境:Flexible Renamer(Perl5互換)
GHI ABC という場合もあるのか、とか GHI ABC GHI GHI とかいう行において全ての GHI にマッチさせて取り出したいのか、とか。
perl5互換って事は、可変長の戻り読み出来ないか・・・。辛いね。
>>925 配列かなんかでもっといて|で連結すればいいだろ。頭使えよ
PHPならそのぐらいできるだろ
ツールなんかでは /aaa/bbb/ という表記がよく使われるけど パスを含むツールでは^/とエスケープするのがちょっと面倒なんで 次にメジャーな表記って何かありますか? |aaa|bbb| とか %aaa%bbb% とか適当に決めちゃえばいいんだろうけどなんかあったら教えてください。
すくなくとも縦棒は他の目的で正規表現の中で使うのが普通だからだめだろ
perlではs///と書きたくないときには、よくs{ }{ }を使うが。
表示できない文字chr(9)などを正規表現の中に含めたいのですが アスキーコードで現したものを含めるにはどうすればいいですか? あと文字変数のようなものは使えませんよね?
C#とjavaです
自己解決 s1 = コードの文字 Regex regex = new System.Text.RegularExpressions.Regex(s); のような感じでできました。
s!うんこ!ちんこ!
944 :
927 :2009/04/24(金) 01:15:25
>ABC DEF GHI >ABC GHI JKL >DEF GHI JKL > >上記の文で"ABC"が含まれている行の >"GHI"だけをマッチさせたいのですが >うまくできません、教えてください >使用環境:Flexible Renamer(Perl5互換) 補足です 行にてABC、GHIが出てくるのは1回のみ、複数回はありません GHIは必ずABCより後ろにきます 説明不足ですみません、よろしくお願いします
そういう行にマッチさせることなら出来るが、 "GHI" の部分にのみマッチさせるのは正規表現じゃ無理。 リネームするのに "GHI" に当たる部分のみを使いたいってんなら パーレンでキャプチャすれば何とかなるんじゃない?
946 :
927 :2009/04/24(金) 22:03:50
>>945 行をマッチさせるのは知っていましたが
"GHI"だけというのは無理なんですね
ありがとうございました
947 :
デフォルトの名無しさん :2009/04/25(土) 01:07:17
>927 perl5互換なら (?:ABC.*)GHI は?
知らないならレスしないでください
可変長戻り読みが使えるなら、 (?<=ABC.*)GHI だね。
950 :
デフォルトの名無しさん :2009/04/26(日) 10:48:24
>>925 禁止したいHTMLタグでは無く
利用しても良いHTMLタグを並べると良い
つまり発想が、逆だ!
pタグの間に改行があったら<br />を付けたいです。 次のような動作を望んでいます。 <p> abc def </p> <p> ghijkl </p> ↓↓↓ <p> abc<br /> def<br /> </p> <p> ghijk<br /> </p>
何のエンジン積んでるか分からんとなぁ・・・。 multiline認識させて、 (?<!\<p\>)$ → \<br \/\> に置換? 戻り読み出来ないエンジンなら、後方参照で [^(\<p\>)](.)$ → \2\<br \/\> に置換とか。
質問です。 長い文字列A "qwertyuiopzxcvbnmAbcasdfghjkl" から ^ 18 文字列B "ABC"の位置を大文字小文字問わず知りたいです。 C#と javaを使ってるのですが、正規表現ではどのように書けばいいでしょうか?
VBSならFirstIndexですぐ求められるんだけど、他の言語分からないや・・・ごめんね。
[^(文字列)] で文字列を否定出来ちゃうとか、どこ星の処理系だよ。
>>954 ありがとうございます。
indexof とか ismatch とか近いものはあるようなので調べてみます。
>>950 ほむ、その手でやってみたんですが、こういうケースだとはじけないのでまずいんです。
<a href="aaa" onclick="alert()">test</a><em>aaa</em>
それは未熟ということじゃ
[(>_<)] なんか引っ掛かりそうな顔文字
(V)o¥o(V)
Javaを使っていて任意の一文字を含んでいるか調べたいです。 Pattern pattern = Pattern.compile("[qwerty]"); Matcher matcher = pattern.matcher("abcdef"); boolean b= matcher.matches(); これでtrueになりません。どこがいけないでしょうか?
頭から尻尾まで丁度マッチしてないといけないとか? "q", "w", "qw" にマッチするか試してみて
>>961 ドキュメント読もうぜ。
> matches メソッドは、入力シーケンス全体とパターンをマッチする
> 戻り値: > 領域シーケンスの全体がこの正規表現エンジンのパターンとマッチした場合にのみ true
ありがとうございます。 どれか一文字のときはどの命令を使いどう書けばいいのでしょうか。 ググってもたいていmatches の例しかなかったもので。
>find() >戻り値: >入力シーケンスの部分シーケンスがこの正規表現エンジンのパターンとマッチした場合にのみ true Pattern pattern = Pattern.compile([qwerty]); Matcher matcher = pattern.matcher("abcdef"); boolean b= matcher.find(); 下にあったfind()でやってみたのですがなぜか trueになりませんでした。
>>966 俺も試したけど find() だとちゃんと true 返したよ。
そうですか、すいません。 デバッグで見てみるとどうもおかしな行の飛び方をしてるようです。 もうすこし試行錯誤してみます。
とりあえず (.{3,})\1{2} こういうことできるのかな
(.{n,}){m,} かね?
文字を入力してそれが数字かどうか判定したいのですが、正規表現を [0-9]+(\.[0-9]*)? としたところ、入力を 122.33.444 などとすると出力が 122.33 (数字) .(不明) 444(数字) というようになります。正規表現に不適な場合は全て不明としています。 これを 122.33.444(不明)と出力するようにしたいのですがどうすればいいでしょうか?
どうして正規表現を使いたいのかがいまいち分からない・・・。 出力と言われても、何の言語かもわからないよ。 一発で出力するんじゃなくて、マッチしなかった場合にフラグを立てるとかはどう? んでフラグが立っていた場合に目的の文字列を結合するとか。 >文字を入力してそれが数字かどうか判定したい のであれば、私だったら型変換で数字型になるかどうかで判定するかな。
>>973 言語はCです。
マッチしなかった場合にフラグを立てる
で問題なく解決できました。 ありがとうございました。
975 :
969 :2009/05/02(土) 13:12:53
ume
u
nn
e
z
うめ
うめっしゅ
おう
.
v
m
あ
q
b
1
l
q
r
k
1
h
性器
うんこ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。