正規表現で複数行のソースコードを一括置換したい

投稿者: Anonymous 条件式に正規表現を使う場合どうすればいいのでしょうか? if (randomNum === 3) { if (inputAnswer === “パン”) { correctAnswerEasyQ(); commentary1.innerHTML = ‘【パン】’; commentary2.innerHTML = ‘たくさん!’; getPoint10(); description1.innerHTML = ”; } else { mistakeAnswerEasyQ(); commentary1.innerHTML = ‘【パン】’; commentary2.innerHTML = ‘たくさん!’; } } を if (randomNum === 3) { while(i < answerNum) { var answerTxt = changeAnswer(); if (answerTxt === ‘パン’) {…(Continue Reading)

pythonの正規表現でn個目のカンマを削除する

投稿者: Anonymous x = ‘項目1,項目2,氏,名,年齢,住所,備考’ 氏,名の間の,を消したい。 re.sub(r”,”,X) ご教示よろしくお願いします。 解決 3個目のカンマだけをグループから除外する方法です。 import re x = ‘項目1,項目2,氏,名,年齢,住所,備考’ re.sub(‘^(([^,]+,[^,]*){2}),(.+)$’, ‘\1\3’, x) 回答者: Anonymous

カンマで区切られた「2桁の数字」にマッチする正規表現について

投稿者: Anonymous たとえば、 123, 45, 67, 890, 10, といった数列が用意されていたとして、このときの ,45 と ,67 と ,10 の”カンマだけ”にマッチするような正規表現を考えています。 二桁の要素は、 カンマ→数字→数字→カンマ であると考えて new RegExp(/,[0-9][0-9],/ ,’g’) としました。 このときカンマだけにマッチさせたいので、最初の文字だけマッチさせるように^をつけました new RegExp(/^,[0-9][0-9],/ ,’g’) ここで、確認用のプログラム var str = “123,45,67,890,10,”; console.log(“————n”); var matching = str.match(new RegExp(/^,[0-9][0-9],/ ,’g’)); console.log(matching); を走らせたのですが、結果は何もマッチしませんでした。 そこで、「カンマだけをマッチ」を抜きして var str = “123,45,67,890,10,”; console.log(“————n”); var matching = str.match(new RegExp(/,[0-9][0-9],/ ,’g’)); console.log(matching); を走らせた結果、 ,45, と ,10, が結果として帰ってきましましたが、 ,67 はマッチしませんでした。これは 123/,45,/67, と文字列が区切られてしまい、67 がマッチングしなかったためであることは理解しています。 私はこの67をマッチングさせる方法と、カンマだけをマッチさせる方法が知りたいです。 解決 2つ目のカンマを「消費」してしまっていることが問題ですので、先読みを使って…(Continue Reading)

文字列を漢字かそれ以外でグルーピングする

投稿者: Anonymous Javaで文字列を与えて「漢字かそれ以外か」でグルーピングしたいです.つまり、1文字とも取りこぼす文字はあってはならないのが条件です.次のようなサンプルを作ってみたのですが… import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexTest { private static Pattern cjkIdeoGraphicOrNotPattern = Pattern.compile(“(?U)([\P{InCJKUnifiedIdeographs}]&&[\P{InCJKUnifiedIdeographsExtensionA}]&&[\P{InCJKUnifiedIdeographsExtensionB}]&&[\P{InCJKUnifiedIdeographsExtensionC}]&&[\P{InCJKUnifiedIdeographsExtensionD}])+|([\p{InCJKUnifiedIdeographs}]|[\p{InCJKUnifiedIdeographsExtensionA}]|[\p{InCJKUnifiedIdeographsExtensionB}]|[\p{InCJKUnifiedIdeographsExtensionC}]|[\p{InCJKUnifiedIdeographsExtensionD}])+”); public static void main(String[] args) { String target = “2000年问题 2001年问题”; Matcher matcher = cjkIdeoGraphicOrNotPattern.matcher(target); while (matcher.find()) { System.out.println(“Matches = “” + matcher.group() + “””); } } } 結果は漢字の部分だけにマッチしてしまいます. Matches = “年问题” Matches = “年问题” 望まれる結果は Matches =…(Continue Reading)

pythonのreモジュールを用いた繰り返し表現の取得について

投稿者: Anonymous 「どんどん」,「もぐもぐ」のように2文字の文字列を2回繰り返したものが入力された文字列に存在するかどうか確かめるプログラムを書きたいのですが,re.compileの引数をどのように書けば目的の文字列を表現するオブジェクトを生成できるでしょうか. よろしくお願いいたします. 解決 2文字限定ならば以下でしょうか (SS)1 2文字に限らず繰り返しならば (S+)1 S =空白以外の文字 1 =後方参照。()の文字を参照している。 回答者: Anonymous

grepの引数として$記号を渡す際のエスケープについて

投稿者: Anonymous bashで正規表現の検索パターンとして$記号を指定したいのですが、エスケープが必要ということは理解しているのですがエスケープはバックスラッシュを直前に1つ入れると理解しているのですが、この場合$ではうまくいかず\$のようにバックスラッシュを2つ差し込むとうまく動くのですがなぜ1つではダメなのでしょうか? export GREP_OPTIONS=’–color=always’ echo I love $ | grep \$ I love $ echo I love $ | grep $ I love $ 上記のコードでは色付けされていませんが、手元のbashではバックスラッシュを2ついれると$記号が赤字で出力されるのですが、1つだと黒字で出力されています。 初歩的な質問で申し訳ありませんが、回答よろしくお願いします。 マルチポスト https://teratail.com/questions/211988 解決 質問冒頭 bashで正規表現 という表現がそもそもの問題がどこにあるかを正しく理解できていないことを示しています。bashももちろん正規表現を扱うことがありますが、今回は無関係です。 今回、bashはgrepという外部プログラムを起動するだけです。 grepとしても$は行末を表すメタ文字ですので、この機能をキャンセルするためにはでエスケープする必要があります。つまりgrepが受け取るべき引数文字列は$です。 次にbashにおいて、はエスケープ記号、$は変数の接頭辞とどちらも特殊な機能を持つためそれぞれでエスケープする必要があります。つまりbashに入力すべき文字列はgrep \$となります。 この手のエスケープをエスケープしてわけがわからなくなることを傾斜爪楊枝症候群と呼ばれています。 grep $ とバックスラッシュが2つでも同様の出力結果が得られ、書籍ではそのように記述されているのですが同様の結果が得られるのはどういう解釈をすれば理解できるのでしょうか? 「バックスラッシュを2ついれると$記号が赤字で出力される」とあるように異常状態を示しています。先に説明したとおり、bashにとって$は変数の接頭辞なため、$の後ろには変数名が続くべきです。それがないため赤字で警告しています。 バックスラッシュ2つは正しくはありませんが、bashは変数としての解釈を諦め$をそのままgrepに渡すため、結果としてgrep \$はgrep \$と同じとなります。 もし書籍にそのような記述がなされているのであれば、筆者の知識が浅いのか、このような説明を端折ったかのどちらかで、どちらであってもろくな書籍とは言えないような気がします。 echoコマンドに関しては $ を出力したい時に引数に echo $ とバックスラッシュ1つで意図通りの出力結果が得られますが、この場合も echo \$ と記述しなくてよいのはなぜでしょうか? grepコマンドに引数として渡す場合とでバックスラッシュの記述の仕方が変わるのはなぜなのでしょうか?…(Continue Reading)

Pythonによる複数のurlの変換方法

投稿者: Anonymous 以下リンク先で行った質問内容が抽象的だったので、こちらでより具体的な質問をさせていただきたく存じます。 公開中 作家別作品一覧拡充版:全て(CSV形式、UTF-8、zip圧縮)の「テキストファイルURL」をローカルファイルパス変換する方法 Python3によるコードで多数のhttps://www.aozora.gr.jp/xxxといったurlを全て/Users/mmm/Documents/UROP_data/aozorabunko-master/xxxという形式に変換したいのですが、どのようなコードが最も効率的に書けますか? 教えていただけると助かります。 解決 質問からすれば正規表現無しの単純置換で出来そうな気がします。例: hoge.replace(‘https://www.aozora.gr.jp/’, ‘/Users/mmm/Documents/UROP_data/aozorabunko-master/’) 回答者: Anonymous

文末の右から左側への文字数を数えて、文字をマッチさせる

投稿者: Anonymous Boost.Regex、Onigmoの正規表現についてです。 正規表現は、左から右側に向かって数えるパターンは一般的ですが、逆の文末から文字数を数えるパターンです。 置換で句読点をたくさんいれたのですが、なかには、以下のように文末の直前でも句読点がはいることになります。 事例 ということで、ある。 句読点は文中にはあったほうがいいのもありますが、一律に置換するとこのようにもなりますので、あまりにも文末に近いところにつくとヘンになります。 この課題として、文末の "。" から、右から左側に10文字以内の "、" をマッチさせて消してしまうという正規表現です。 例文 自動車業界は、自動運転の方向で、法整備が進んでいるので、ある。 置換後 自動車業界は、自動運転の方向で、法整備が進んでいるのである。 10文字以内のものは一括でマッチさせたいですが、例外として、以下のパターンは除くと言う条件にしたいです。 接続が "は、" になっているところです。 事例 オーストラリア大陸は、続く。 置換後 影響しない オーストラリア大陸は、続く。 このように文末の "。" の直前でも "は、" は例外とするというパターンです。。 解決 一部の正規表現には先読み((?=…)と(?!…))という機能があります。先に読み進めることはないものの、直後に何が続いているか/続いていないかの判定が行えます。これを使うと 、(?=.{0,9}。) とでき、「直後の10文字以内に。が現れる」という条件を満たす、を見つけることができます。 更に後読み((?<=…)と(?<!…))という機能で、直前に何が続いていた/続いていなかったかも判定できます。これを使うと (?<!は)、(?=.{0,9}。) とでき、「直前にはが現れず直後の10文字以内に。が現れる」という条件を満たす、を探すことができます。 Boost.RegexのPerl構文とOnigmoはこれらの機能に対応していると思います。 正規表現は、左から右側に向かって数えるパターンは一般的ですが、逆の文末から文字数を数えるパターンです。 数える方向を気にされているようですが、右から数えようが左から数えようが文字数に違いはありません。 また置換について触れられていますが、正規表現はあくまで条件を満たす文字列にマッチさせるものです。どのように置換したいかはあまり関係ありません。もちろん置換方法によっては別の文字列をマッチさせた方が効率的な場合もありますが。 今回でいうと、nekketsuuuさんも指摘されていますが、置換によって文字列が短くなり、新たに条件を満たす、が現れることがありますが、正規表現としてはどのように置換されるかは把握していないためこのような条件にマッチさせることはできません。 少し条件を変えて「、以外の文字が10文字以下続く。」という考え方も可能ですが、残念ながらこれを表すのは無理(少なくとも私はわからない)です。 回答者: Anonymous

VisualC# 文字列の置換

投稿者: Anonymous テキストボックス2つとボタン1つの簡単なアプリケーションを作っています。 textBox1に入力された文字列をボタンを押すと置換されたtextBox2に表示させるだけです。 textBox1に http://example.com/2244/ha/saitama/jfa4w09f.12.jpg と入力すると <img src=”http://example.com/2244/ha/saitama/jfa4w09f.10.jpg”> <img src=”http://example.com/2244/ha/saitama/jfa4w09f.13.jpg”> <img src=”http://example.com/2244/ha/saitama/jfa4w09f.22.jpg”> <img src=”http://example.com/2244/ha/saitama/jfa4w09f.24.jpg”> <img src=”http://example.com/2244/ha/saitama/jfa4w09f.30.jpg”> と置換されます。 ポイントはここです。 .{10~50までのランダム数字}.jpg この10~50までの数字はランダムに足されていきます。 文字列の置換方法を教えて下さい。MSDN公式正規表現サイトを見ても難儀でした。 解決 よう分からんですが… こういうことですか? replaceの入力: “http://example.com/2244/ha/saitama/jfa4w09f.12.jpg“ replaceの出力: “http://example.com/2244/ha/saitama/jfa4w09f.16.jpg“ “http://example.com/2244/ha/saitama/jfa4w09f.29.jpg“ “http://example.com/2244/ha/saitama/jfa4w09f.45.jpg“ “http://example.com/2244/ha/saitama/jfa4w09f.50.jpg“ “http://example.com/2244/ha/saitama/jfa4w09f.23.jpg“ class Program { static void Main(string[] args) { string url =”http://example.com/2244/ha/saitama/jfa4w09f.12.jpg”; var urlList = replace(url); } static public List<string> replace(string url) {…(Continue Reading)

PCRE正規表現での文字列検索パターン高速化について

投稿者: user7751 お世話になります。 phpのpreg系関数で正規表現パターンを以下のように記述する際に、検索対象文字列をシングルバイトのみの対象にする装飾子があった気がするのですが、ド忘れしてしまいました。 preg_match(“/^[0-9a-z._-]+$/”,$str,$matched); これを preg_match(“/^[:@0-9a-z._-]+$/”,$str,$matched); のようにすれば、マルチバイト文字を検索することがないので 正規表現検索が高速化出来た気がするのですが、ググってもそれらしきリソースが出てきませんでした。 (私の検索方法が悪いのかもしれないのでしょうが) 皆様のお知恵をお貸しいただけませんでしょうか、宜しくお願い申し上げます。 解決 パターン修飾子のマニュアルをご覧いただければわかるように、UTF-8 を対象とする u (PCRE_UTF8) 修飾子は存在しますが、シングルバイトのモードは存在しません。u オプションは後付けなので、デフォルトでシングルバイトモードとも言えます。ご提示の文字クラスを満たすかどうかをチェックする処理を C 言語のように書くと次のようになります。C 言語では1バイト単位で処理することになるので、それ以上の最適化を求めるのであれば、機械語の話になるのではないでしょうか。 var_dump( true === is_allowed(‘aiueo12345._-‘), false === is_allowed(‘あいうえお’) ); function is_allowed($str) { $size = strlen($str); for ($i = 0; $i < $size; ++$i) { $c = ord($str[$i]); if (($c >= 0x30 && 0x39 >= $c)…(Continue Reading)

改行を挿入する形で置換しようとしたとき、最後に余計な改行が入る

投稿者: Anonymous 例えば sample.txtというファイルがあり、その中に下のような文章が書かれていたとします。 これは普通の質問だな。ただ、この質問は良い質問だ。でも、これは悪い質問だ。 このテキストファイルに対し、「。」毎に改行を入れたいと思ったとします。上の例でいうならば、下のようなことを意図しています。 これは普通の質問だな。 ただ、この質問は良い質問だ。 でも、これは悪い質問だ。 そこで、sed “s/。/。n/g” sample.txtという形で改行を挿入するのを試みました。すると、結果としては最後の。でも改行が入ってしまい、空行が最後についてしまいます。 渡し先で空行を無視するようにもできますが、どうせならこの置換の時に、最後の空改行を防ぐ形にしたいと思うのですが、どのようにするのがベターでしょうか? 解決 幾つかやり方はあると思いますが、 。 のあとに任意の文字があることを利用した、 こんなやり方はどうでしょうか。 sed -e ‘s/。(.)/。n1/g’ sample.txt 回答者: Anonymous

金額の、正規表現の書き方:数字の前の0(ゼロ)を削除する方法

投稿者: Anonymous ¥01,900のパン →¥1,900のパン ¥0,900のパン →¥900のパン にする方法を教えてください。 「数字のカンマを外して、数字の前の0を削除して、数字の3桁毎のカンマを付ける」以外の方法がありますか? よろしくお願いします。 金額の、正規表現の書き方 (参考)正規表現で数字の前の0(ゼロ)を削除する方法 http://www.php-mysql-linux.com/regular-expression/no0/ 解決 Perlなら、こうすればたぶん十分です。 my $price = "¥01,900"; $price =~ s/¥(0+,?)*/¥/; (携帯を使っていますので、試すことができません) 例外: ¥0のパンに不対応。 回答者: Anonymous

正規表現のエスケープが期待通りに動作しない

投稿者: Anonymous Javaの正規表現についてサイトを通して勉強中です。 下記のソースを実行しましたが結果は 「マッチしません」と表示されてサイトでは「マッチする」という結果になります。なぜでしょうか。 ■ソース String str1 = “stat[01]end”; String str2 = “array[int]”; String regex = “¥¥[.*¥¥]”; Pattern p = Pattern.compile(regex); check(p, str1); check(p, str2); } private static void check(Pattern p, String target){ Matcher m = p.matcher(target); if (m.find()){ System.out.println(“マッチします”); System.out.println(“マッチした部分は ” + m.group() + ” です”); }else{ System.out.println(“マッチしません”); } } } 解決 おそらく¥記号のせいでしょう。あなたがコードに貼り付けた¥はユニコードのU+00A5,…(Continue Reading)

rubyの正規表現を扱う際の文字セットについて

投稿者: Anonymous rubyの正規表現を扱う際の挙動についてよくわからないことがあります。 HTMLのパースをしているのですが、 Regexp.new(“スタックオーバーフロー”) => /スタックオーバーフロー/ Regexp.new(“<h1>スタックオーバーフロー</h1>”) => /<h1>u30B9u30BFu30C3u30AFu30AAu30FCu30D0u30FCu30D5u30EDu30FC</h1>/ というような、上はUTF-8そのままで正規表現化できるのですが下の場合はunicodeがそのまま出てきてしまうという動きになっており、なぜこのようになるのかわかりません。 理想としては => /<h1>スタックオーバーフロー</h1>/ という正規表現がほしいのですが、どのようにすればよいでしょうか? あまり文字コードや文字セットなどに詳しくないので見当ハズレなことを聞いているのかもしれませんが、よろしくお願いします。 解決 Regexp.new(“<h1>スタックオーバーフロー</h1>”) => /<h1>u30B9u30BFu30C3u30AFu30AAu30FCu30D0u30FCu30D5u30EDu30FC</h1>/ これはirbやpryで上記コードを実行した結果かpの類いで表示した結果だと思います。表現上uxxxx形式になっているだけで、渡した文字列に対する正しい正規表現オブジェクトが生成されてます。 Regexp.new(“<h1>スタックオーバーフロー</h1>”) == /<h1>スタックオーバーフロー</h1>/ => true こうなってしまう理由はよくわかりませんが、/を/regexp/形式に含めるにはエスケープが必要なので、巻き添えで非ASCII文字もエスケープされてるんではないかなと想像します。 なおHTMLを正規表現でパースするのはたいていの場合よくない方法です。Nokogiriという定番のHTML/XMLパーサライブラリがあるので、そちらを使うことも検討した方がよいとおもいます。 回答者: Anonymous

交通アクセスの情報から徒歩分数の数値のみを取り出す方法

投稿者: Anonymous ホテルのアクセス状況にある、最寄り駅からの「徒歩分数」から、徒歩分数の数値を取得したいと考えています。 徒歩分数の数値のみを取り出して、それ以外は欠損値とする、 新たなデータを作成したいと考えています。 import re import pandas as pd import zenhan # 全角半角を修正するモジュール df = pd.DataFrame( {‘x’: [‘交通アクセスJR神田駅より徒歩4分’, ‘交通アクセス東京駅1駅2分、東京ディズニーリゾート(R)2駅12分◆八丁堀駅A2・A3出口から徒歩3分◆銀座・有楽町へアクセス良好!’, ‘交通アクセス東京駅より徒歩3分(八重洲中央口より)、羽田空港よりリムジンバスで30分、成田空港よりJRエクスプレスで60分。’, ‘アクセス:JR東京駅から3駅7分「潮見駅」(東口)からすぐ右手正面TDR・TDL「JR舞浜」まで3駅8分駐車場:敷地内45台1泊1,500円先着順予約不可駐車台数に限りがある為、極力公共交通機関をご利用下さい’, ‘アクセス:JR神田駅・営団地下鉄銀座線神田駅徒歩2分駐車場:なし’]}) def get_walk_time(s): s = zenhan.z2h(s) if not re.match(r'(徒歩|約)’, s): return None m = re.search(r'(d+)分’, s) return m.group(1) df[“walk_time”] = df.x.map(get_walk_time) print(df.walk_time) 現在は次のような結果になっています。 0 None 1 None 2 None 3 None 4 None…(Continue Reading)

PowerShellでテキストから正規表現を用いて特定の数値を抜き出し四則演算を行いたい

投稿者: Anonymous hoge.txt hoge0500huge4600telssae0700 hoge0600huge4700telssae0800fdef 例えばこの様なテキストがあったとして ^hoge0(d{1,})huge4(d{1,})telssae0(d{1,})(.*)?$ この様な正規表現を用いて特定の数字を取得して、その数値に四則演算を行いテキストとして出力したいです。 イメージとしてはこのような感じです。 $x = 2 (正規表現) ^hoge0(d{1,})huge4(d{1,})telssae0(d{1,})(.*)?$ $AA = $1 / $x $AB = $2 / $x $AC = $3 / $x (テキスト出力) hoge0$AAhuge4$ABtelssae0$AC$4 (出力結果) hoge0250huge4300telssae0350 hoge0300huge4350telssae0400fdeffdef どのようにすればよいか教えて頂けると幸いです。 補足 $WARU = 2 $text = @" hoge0500huge4600telssae0700 hoge0600huge4700telssae0800fdef "@ $pat = "hoge0(d{1,})huge4(d{1,})telssae0(d{1,})(.*)?" $regex = [regex]$pat $regex.Matches($text) | foreach {…(Continue Reading)

python3 正規表現 指定範囲内の文字列抽出

投稿者: Anonymous 変数aと変数bの間に含まれている文字列を最初にマッチしたところで取り出したいのですが、うまくいきません。以下のように書いてみたのですが最後の変数bまでの範囲を取得してしまい、期待する出力を得られませんでした。どうすれば解決するでしょうか。 a = ‘<a>’ b = ‘<b>’ text = ‘<a>bbb<b>ccc<b>’ r = re.search(r’%s(.*)?%s’%(a,b), text) print(r.group(1)) 出力結果 bbb<b>ccc 期待する出力 bbb 解決 (.*)?では(.*)があるかないか、の意味になってしまいます。(.*?)とすべきでしょう。ただそれよりは確実に含まれない文字で判定した方がいいです。例えば([^<]*)とか。 回答者: Anonymous

python3系で複数回文字列置換を行いたい

投稿者: Anonymous python3系で対象となる文字列に含まれるパターンすべてを置換するにはどうすればいいでしょうか? 例としましては [[wiki.cgi?=PAGE|PAGE]]を参照するには[[wiki.cgi?=TITLE|TITLE]]にアクセスしてください ↓ [[PAGE]]を参照するには[[TITLE]]にアクセスしてください のようにしたいと考えております。 解決 reモジュールのsub関数、もしくはregex.subが使えます。 例: In [1]: import re In [2]: re.sub(r'[[wiki.cgi?=([A-Z]+)|1]]’, r'[[1]]’, ‘[[wiki.cgi?=PAGE …: |PAGE]]を参照するには[[wiki.cgi?=TITLE|TITLE]]にアクセスしてください’) Out[2]: ‘[[PAGE]]を参照するには[[TITLE]]にアクセスしてください’ 回答者: Anonymous

Python3 での正規表現への変換について

投稿者: Anonymous Python3で [xx-yy] という形式で範囲を示した数(文字列)を、正規表現に変換するには、どのように記述すれば良いでしょうか? 入力例 hoge1 = ‘[10-20]’ hoge2 = ‘[0-100]’ hoge3 = ‘[23-94]’ 期待する出力 hoge1 = ‘1[0-9]|20’ hoge2 = ‘[1-9]?[0-9]|100’ hoge3 = ‘2[3-9]|[3-8][0-9]|9[0-4]’ 解決 「期待する出力」を見て、右の桁から順に文字クラスにまとめるという意図らしいと思い、ざっくり書いてみました。Pythonらしい書き方になってないと思いますが、そこはご容赦を。 import re def _parse_numrange(s): m = re.search(r'[(d+)-(d+)]’, s) return m.group(1), m.group(2) def _join_pos_digit(lst, p): lst2 = [lst[0]] # 処理後のリスト for i in range(1, len(lst)): if len(lst[i]) < p…(Continue Reading)

日本語を含む文字列から正規表現を使って抽出する方法

投稿者: Anonymous 日本語を含む文字列から正規表現を使って抽出をしたいのですが、上手くいかなくて困っています。 ライブラリはregex-pcreを使っています。 Stringではマッチする部分がずれるのか、マッチの結果の2つ目に何も入っていません。 ByteStringではマッチする部分は取れているようなのですが、日本語のデータが抜け落ちてしまいます。 import Text.Regex.PCRE “123あいうえお456かきくけこ” =~ “(\d+)(\D+)” :: [[String]] –[[“1231235412356123581236012362&4561236312365123671236912371″,”123″,”1235412356123581236012362&4561236312365123671236912371”],[“”,””,””]] import Data.ByteString.Lazy.Char8 as B B.pack “123あいうえお456かきくけこ” =~ “(\d+)(\D+)” :: [[B.ByteString]] — [[“123BDFHJ”,”123″,”BDFHJ”],[“456KMOQS”,”456″,”KMOQS”]] また、compUTF8というオプションがあったので試してみたのですが let reg = makeRegexOpts compUTF8 defaultExecOpt “(\d+)(\D+)” matchAllText reg “123あいうえお456かきくけこ” — [array (0,2) [(0,(“1231235412356123581236012362&4561236312365123671236912371”,(0,18))),(1,(“123”,(0,3))),(2,(“1235412356123581236012362&4561236312365123671236912371”,(3,15)))],array (0,2) [(0,(“”,(18,18))),(1,(“”,(18,3))),(2,(“”,(21,15)))]] となり、同様の結果のようです。 環境はUbuntu14.04($LANG=ja_JP.UTF-8)、stack0.1.5.0(ghc-7.10.2、lts-3.6)です どうにかして日本語を含むStringかByteStringから正しくマッチさせて抽出することはできないでしょうか? よろしくお願いします。 解決 以下のウェブページを参照しますと、どうやら regex-pcre パッケージのバグの様です。   [Haskell-cafe] regex-pcre is not…(Continue Reading)

リストから日本語以外の要素を削除したい

投稿者: Anonymous 様々なstr要素が含まれるリストから、日本語(ひらがな、カタカナ、漢字)以外の物を削除するコードを書いたのですが、何度も実行しないと全て消えてくれません。どうやら数字、アルファベットは一括で消すことが出来ても、記号を一つ消すたびにbreak(?)してしまうように見えるのですが・・・どうしたらいいのでしょうか。 import re bag_of_things = [“あいうえお”, “546”, “たぬき”, “饅頭”, “abdf”, “#%&”, “aodih”, ” “, “hello”, “こんにちは”] nihongo = re.compile(‘[ぁ-んァ-ン一-龥]+’) def clean(list): for item in list: if not nihongo.findall(item): print(item, “is not japanese”) list.remove(item) [ 解決 for文の途中で、forで回しているlistの要素を削除しているため、対象オブジェクトがずれてしまっているのが原因です。 >>> L = list(range(10)) >>> L [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>>…(Continue Reading)

正規表現で “月日” を表す文字列から末尾以外の0を削除したい

投稿者: Anonymous 末尾の0でない0を削除したいのですが、/[^0$]0/ こうすると0と直前の文字を削除してしまいます。/^(?!0$)0/ こちらも試しましたが、マッチしませんでした。 ’12/09′.replace(/[^0$]0/, ”) // この場合は0を削除したい ’12/10′.replace(/[^0$]0/, ”) // この場合はしたくない replace(/^(?!0$)0/, ”) ご教示いただければ幸いです。 解決 月日を表す文字列の日付部分だけ、一桁の数なら二桁目の 0 を消したいということでしょうか。 であれば、/ の直後が 0 であれば 0 を削除すれば良さそうです。 ’12/09′.replace(//0/, ‘/’); // ==> ’12/9′ ’12/10′.replace(//0/, ‘/’); // ==> ’12/10′ ’01/02′.replace(//0/, ‘/’); // ==> ’01/2′ 月の部分も消したいのであれば、数字部分を認識して上桁のゼロを消すのはどうでしょうか。 ’12/09′.replace(/0+(?=[0-9])/g, ”); // ==> ’12/9′ ’12/10′.replace(/0+(?=[0-9])/g, ”); // ==> ’12/10′ ’01/02′.replace(/0+(?=[0-9])/g, ”); //…(Continue Reading)

正規表現を使ったファイルやフォルダパスのマッチング

投稿者: Anonymous 以下に該当する文字列を正規表現でマッチングさせたいのですが、どう書けば良いでしょうか? 拡張子txtとjpgのファイルパス txtとjpgという名前のファイル及びフォルダを含むパス 実行環境はRegExrです。 以下はtxtのみに絞ったテストケースです。 該当する txt txt/ /txt .txt foo.txt txt/foo.txt /foo.txt /txt/foo.txt /txt/foo/bar.baz /bar/txt/foo.txt /txt/txt/foo.bar 該当しない(1つ目の.txt には末尾にスペースあり) .txt .txtfoo .footxt .footxtbar .foo.txt.bar .foo.txt*.bar .foo.txt誤 .foo.txt誤.bar .foo.誤txt .txt foo .foo.txt foo foo.誤txt txt.foo /txt.foo 誤txt/foo.bar bar/txt.foo /bar/txt.foo foo/bar/txt.baz /foo/bar/txt.baz /foo/bartxt/txt.baz /foo/bar.txt/txt.baz 解決 /^(((.*/)?txt(/.*)?)|(.*.txt))$/gm http://www.regexr.com/3b66t 回答者: Anonymous

vimのsubstitute関数で先頭からカンマまでを削除したい

投稿者: Anonymous やりたいこと vimでsubstitute関数を使い,文頭からはじめの,までを削除したいです. (例えば,WIP,$HOME/Desktop/WIPという文字列を$HOME/Desktop/WIPに変換したい.) うまくいかないこと Vimを起動した直後に次のようなコマンドを打つと,期待しない動きになります. :echo substitute(“WIP,HOME/Desktop/WIP”, “^.{-1,},”, “”, “”) WIP,HOME/Desktop/WIP 特定の文字列を前提とした,次のような例は動きます. :echo substitute(“WIP,HOME/Desktop/WIP”, “^WIP,”, “”, “”) HOME/Desktop/WIP :echo substitute(“WIP,HOME/Desktop/WIP”, “^W.P,”, “”, “”) HOME/Desktop/WIP 以下は他に試したが期待しない動きになったパターンです. :echo substitute(“WIP,HOME/Desktop/WIP”, “^.{-},”, “”, “”) WIP,HOME/Desktop/WIP :echo substitute(“WIP,HOME/Desktop/WIP”, “^.+,”, “”, “”) WIP,HOME/Desktop/WIP :echo substitute(“WIP,HOME/Desktop/WIP”, “^.{-},”, “”, “”) WIP,HOME/Desktop/WIP :echo substitute(“WIP,HOME/Desktop/WIP”, “^.+,”, “”, “”) WIP,HOME/Desktop/WIP 一応次のパターンであれば動きましたが,「1文字以上+,」ではありません. :echo substitute(“WIP,HOME/Desktop/WIP”, “^.*,”,…(Continue Reading)

入力値にひらがな・カタカナ・漢字以外が含まれていないかを調べたい

投稿者: Anonymous キーボードで入力できる全角記号を除外したいのですが、知識不足で理解できず、どなたかご教授いただければと存じます。 ■やりたい事■ フォームの名前フィールド(全角漢字)で、登録許可項目以外エラーメッセージを表示 エラーは送信ボタンを選択する前に表示したい。その為JSでバリデーションを作成している ※ブラックリストを作成し、Ajaxで確認する方法もあるかと思いますが、一旦は正規表現での   やり方をご教授いただければと存じます。 ▲フィールドの登録許可▲ 漢字・全角カナ ●現在設定したバリデーション● 半角記号・連続文字 ■現在作成した正規表現■ /^([wu3040-u309f])1*$|d+|[a-zA-Z]|[!-/]|[:-?]|[[-`]|[{-~]/ ▲止まっている所▲ キーボードで入力できる全角記号除外の正規表現 元々の要望は漢字 カナ ひらがな  以外は登録を除外するという要望なので、 カナ ひらがな  以外は登録を除外という正規表現の書き方がありましたら、その内容もご教授いただければと存じます。 恐れ入りますが、よろしくお願いします 解決 ご教授頂いたユニコード文字プロパティが利用できなかったので、べた書きで対応しました。 もっとよい書き方があるかもしれませんが、、、、 /^([wu3040-u309f])1*$|d+|[a-zA-Z]|[!-/]|[:-?]|[[-`]|[{-~]|[“!”#$%&’()=~|‘{+*}<>?_-^¥@「;:」、。・”]/ 回答者: Anonymous

正規表現で、or(|)を使った記述を、orを使わないで一つにまとめて記述したい。

投稿者: Anonymous before (A[0-9])|(B[0-9]b) これをor(|)を使わないでまとめて記述してA1、B2bのような文字列にマッチするようにできるでしょうか? after ([AB][0-9]b?) のように記述すると、beforeではマッチしないA1bのような文字列にマッチしてしまいます。 ([0-9]がもっと複雑な正規表現の場合にafterのような感じでまとめて書けるなら記述も処理も効率的になるかと思い、質問させていただきました。) 解決 正規表現はエンジンごとに使える機能が異なります。質問のような特殊なマッチとなると、正規表現エンジンごとに可否が分かれたり、表記が異なったりします。 特定の正規表現エンジンに関する質問であれば、質問文に明記願います。 参考までにC#言語等で利用可能な.NETの正規表現ですと有効なキャプチャ グループに基づく条件一致が使えます。 ((?:(A)|B)[0-9](?(2)b?|)) これではわかりづらいので名前付きグループを使用すると (?<all>(?:(?<a>A)|B)[0-9](?(a)b?|)) でしょうか。 javascriptでは不明。 残念ながらJavaScriptの持つ正規表現にはそのような機能はありません。 回答者: Anonymous

linuxでregex_matchするとuse of deleted functionって怒らっれる。

投稿者: Anonymous 次のようなc++例題がコンパイルできません。 #include <iostream> #include <regex> int main(int argc, char* argv[]){ using namespace std; smatch sm; cout << regex_match(string(“hahaha”), sm, regex(“(ha){3}”)) << endl; return 0; } Mac OS X 10.9 + clang++ またはwindows + cygwin + gcc 4.9 では上の例はちゃんとコンパイルされ、予測している結果の1を出力します。 しかし、linuxでgccを使ってコンパイルすると何故か次のように怒られます。 foo.cpp: In function ‘int main(int, char**)’: foo.cpp:13:61: error: use of deleted function ‘bool std::regex_match(const…(Continue Reading)

URLの正規表現を用いた置換を教えてください

投稿者: Anonymous <a class=”url” href=”https://hoge1/123456789/hoge2/”>123456789</a> こういうモノがあったとして、『hoge1』と『hoge2』を書き換えたいのですが 『123456789』はランダム英数字になるので var target, i, l = document.links.length; for (i = 0; i < l; i++) { target = document.links[i].href; document.links[i].href = target.replace(/hoge1/123456789/hoge2//, “hoge3/123456789/hoge4/”); } これでは出来ません そこで置換の際の英数字(123456789)を置換後にも持って行きたいのですがどうすれば良いですか? 解決 “ランダムな数字”は[0-9]+の正規表現で”数字1桁以上”として表せ、この部分を()で囲んでおくと置換部分にて$1で参照することができます。()のペアが増えるたびに$1, $2と数字部分が増えていく。 まとめると、 target.replace(/hoge1/([0-9]+)/hoge2//, “hoge3/$1/hoge4/”); 回答者: Anonymous

PHP正規表現で、「タブ区切り」から「タブ区切り」までを選択して、前後にdivタグを挿入

投稿者: Anonymous ■対象 $hoge=”×××× tab→ 抽出抽出 ←tab ××××××”; ■やりたいこと1 ・PHP正規表現で、「タブ区切り」から「タブ区切り」までを選択して、前後にdivタグを挿入したい ・うまくいかないコード preg_replace(/t(.*?)t)/m, “<div>$1</div>”, $hoge); ・希望結果1 $hoge=”×××× tab→<div>抽出抽出</div>←tab ××××××”; ■やりたいこと2 ・PHP正規表現で、「空行」から「空行」までを選択して、前後にdivタグを挿入したい ・うまくいかないコード preg_replace(/^n(.*?)^n)/m, “<div>$1</div>”, $hoge); ・希望結果2 $hoge=”×××× <div> tab→ 抽出抽出 ←tab </div> ××××××”; 解決 ■ 1つ目 $hoge=”×××× tab→ 抽出抽出 ←tab ××××××”; echo “nbefore:n”, $hoge; $replace = preg_replace(‘/t([^t]+)t/’, ‘<div>$1</div>’, $hoge); echo “nafter:n”, $replace; で、こんなのが得られるのでは所望の動きではないでしょうか? before: ×××× tab→…(Continue Reading)

英単語のアルファベットの間に半角スペースをいれたい。

投稿者: Anonymous インデザインCC15を使用しています。 英単語の一つ一つのアルファベット間に半角スペースを挿入させたいのですが、検索して一括置換させるような事は正規表現でできるのでしょうか? 例えば『Mon』→『M o n』のようにしたいです。 単語の前後には半角スペースを入れたくはありません。 ×『 M o n 』 ○『M o n』 その行には英単語一語のみです。 詳しいかたがいれば教えていただきたいです。 よろしくお願いいたします。 解決 検索対象を([A-Za-z])(?=[A-Za-z]) 置換対象を1(1の後ろに半角スペース一個です) ではいかがでしょうか? 回答者: Anonymous