秀丸の正規表現を用いて「その行で最初にマッチした単語」だけを取得したいのですが可能でしょうか

一例をあげますと、
検索文字列:ももりんごみかんももりんごみかん
とあるとき、左の「りんご」だけを「なし」に置換したいという希望です。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

> ついでといっては恐縮ですが、(?\2)という部分がどのような意味なのか教えて


これより前の部分で、() で囲まれた部分の 2 つ目のみにヒットさせる
という意味になります。詳細は、HmJre.dll のヘルプをご覧下さい。
秀丸エディタのヘルプの正規表現の項目からも辿れます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
HmJre.dllのヘルプというものもあったんですね。これを見て勉強します。

本当に助かりました。ありがとうございました!

お礼日時:2011/04/09 10:26

> 検索文字列:ももりんごみかんももりんごみかん


> とあるとき、左の「りんご」だけを「なし」に置換したいという希望です。
 最新版 Ver.8.03 なら出来ます。どのヴァージョンから可能になったかまでは調べていませんが

検索文字列を
^(.*?)(りんご)(.*)(?\2)$
とします

古いヴァージョンではマクロを組む必要があるでしょう
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご教授いただいた方法で検索が確認できました。

ついでといっては恐縮ですが、(?\2)という部分がどのような意味なのか教えて頂けないでしょうか。
宜しくお願い致します。

お礼日時:2011/04/08 21:40

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q正規表現でのパイプ(or)を減らしたいのですが

いつもお世話になっています。
正規表現のパイプ(|)は非常に遅くなるらしいので、[]内に並べるようにプログラムを修正しようと思っています。それで、
/a|b|c/ ---> [abc]
のような方法は、よく紹介されているのですが、a,b,cが単独文字ではなく、単語になっているような場合、
/abc|def|ghi/ ---> [(abc)(def)(ghi)]
だと多分ダメですよね(今実行環境が無く確認できません)。
それで、各々の単語を
$a = 'abc';
$d = 'def';
$g = 'ghi';
のようにあらかじめ定義しておいて、
/$a|$d|$g/ ---> [$a$d$g]
というように書き換えると、うまくいくのでしょうか?
やり方が間違っていましたら、ご指摘いただきたく、よろしくお願いします。

Aベストアンサー

ブラケットの中は独立したキャラクタとして扱われるので文字列をそこに収めることはできません。
#これは#1の方の回答にもあるとおり

そんなに気になるのなら
Regexp::Optimizer - optimizes regular expressions - search.cpan.org
http://search.cpan.org/~dankogai/Regexp-Optimizer-0.15/lib/Regexp/Optimizer.pm
このモジュールを使ってみるとか。

正規表現のマッチングを遅くする原因は色々あるので、
本当にその辺を知りたければ

oreilly.co.jp -- Online Catalog: 詳説 正規表現 第2版
http://www.oreilly.co.jp/books/4873111307/

を頑張って読破しましょう。

Q(秀丸)正規表現で、""をマッチさせるには?

お世話になります。

以下2行に、それぞれマッチさせて、
末尾の""(ダブルコーティション)を外して置換えしたいです。

1-234,漢字,ABC,123円,"789"
1-234,漢字,ABC,"1,234円","789"

秀丸の正規表現
検索  ^(([^,]?)*),(([^,]?)*),(([^,]?)*),(([^,]?)*),"((.?)*)"$
置換  \1,\2,\3,\4,\5
で試したところ、
1-234,漢字,ABC,123円,"789"
では、マッチして、
1-234,漢字,ABC,123円,789
と置換されて結果OKでした。

しかし、
1-234,漢字,ABC,"1,234円","789"
の方ではマッチしませんでした。

そこで質問させていただきますが、
1-234,漢字,ABC,"1,234円","789"
でマッチするようにする為には、
上記しました秀丸の正規表現(検索)を、
どのように変更すればよろしかったでしょうか?

以上になります。
宜しくお願いいたします。

Aベストアンサー

下の例でマッチしなかった理由は実は簡単で,
^(([^,]?)*),(([^,]?)*),(([^,]?)*),(([^,]?)*)「,」"((.?)*)"$
の最後の「,」が
1-234,漢字,ABC,"1「,」234円","789"
の「,」になってしまうから.

で, なんだけど, そもそも「末尾の""(ダブルコーティション)」と言っているんだから素直に「末尾の""(ダブルコーティション)」と書けばいい. 例えば
^.*,"[^"*]"$
でいけるんじゃないかな.

あと, #1 で「奇妙奇天烈」と書いたのは, 質問文にある正規表現の
([^,]?)*
とか
(.?)*
とかが明らかに変なんです. これ,
[^,]*

.*
と結果的に同じでしょ?

Q【Ruby or Perl・正規表現】ある文字列の先頭5文字を残して削除するには?

初心者質問で恐縮です。
RubyもしくはPerlで、ある文字列の先頭5文字を除く文字をすべて削除する(先頭5文字のみの文字列にする)には、どのような記述をすればよいでしょうか。
教えていただけるとうれしいです。
よろしくお願いします。

Aベストアンサー

Perlなら

s/^(.....).*$/$1/;

でいけるように思います。

Q秀丸の正規表現を教えてください

・・・・
GC_log.log(95): at service.bidirect(CnfCGWServerSocketMgr.java:97)
GC_log.log(103): at service.bidirect.(CnfCNFServerSocketMgr.java:97)
GC_log.log(237): 80: 3 264 service.bidirect.common.network.common
・・・・

上のログから、「GC_log.log(237): 80: ~」の行だけをグレップしたいのですが、
正規表現の書き方がわかりません。

GC_log.log([0-9]?): [0-9]?:

でグレップしたところ、コロンがだめなようでした。
お力添えを宜しくお願いします。

Aベストアンサー

GC_log.log\([0-9]+\): [0-9]+:

じゃないんですか?(HmJre.dll Ver3.41で確認)

"("と")"がメタキャラクタとして認識される為に\でエスケープ。
行番号などが1桁ではないので"?"から"+"に変更。
です。

Q言語ではなく、正規表現のみで複数の条件を記述する方法 ?

一つの条件の正規表現は書けるようになりましたが、
条件が重なった場合の対処の仕方がわかりません。

my $val = "12";
#数字のみ
if($val =~ /^[0-9]+$/){
# match!
}

#0で無い
if($val !~ /^0$/){
# match!
}

# 数字で0でない <---複数条件



# 言語でカバーするのではなく、正規表現のみ(1つの正規表現)
# でANDやORやXORができるパターンの記述方法が知りたいです。
if($val =~ /^[0-9]+$/) && ($val !~ /^0$/){
# match!
}

Aベストアンサー

条件式の AND や XOR に相当するものは、正規表現には存在しません。というのも、正規表現で表すのは「パターン」であり、「条件」ではないからです。
※OR についてはパターンの選択を行う | が相当します。

このため、複数の条件式にしたくない場合は、1つで複数の条件を満たすパターンを書くしかありません。また、汎用的な方法もないので、ケースごとにパターンを書き下ろさなければなりません。

No.2 補足より
> 言語を使った&& ||ではスマートではなく、複雑な内容になってきた場合、1行で解決できた方が発展性があるかと思いましてこだわっております。

確かに「0ではない数字」程度のことを複合条件にするのはスマートとは言えないでしょう。しかし、関連性のない事柄を無理なパターンで表現するくらいなら、分解して && や || で結合した方がすっきりします。
また、大概の場合、1行で無理に解決した方が発展性には欠けますので、発展性やメンテナンス性を求めるならば、あまりこだわらない方がよいでしょう。

Q秀丸での正規表現:複雑な条件を指定する場合

秀丸エディタの強調表示設定を正規表現を使用して使用しています。
[a-zA-Z][a-zA-Z0-9_]+\s+[a-zA-Z][a-zA-Z0-9_]+ という正規表現でマッチさせたいのですが、else if というケースでもヒットすると思います。これを例外としてマッチさせたくない場合、どういった記述になるのかが思いつきません。直接的な答えでなくてもいいので、何か解法のヒントなどありましたらご指南いただけませんでしょうか。

よろしくお願いいたします

Aベストアンサー

その表現にマッチするパターン(なにかのデータのようですが)と else if が一緒に入っているファイル、というのが想像しにくいのですが。


○そのパターンより、優先順位の高いものとしてelse if を登録する。
例えば、 そのパターンを強調1 に、 else ,if を 強調2 に
○そのパターンの強調を止めて、まわりを強調する。結果、そのパターンの部分が目立つ

というあたりはどうでしょうか。

Q正規表現について

HTMLファイルを読み込み、特定の文字列にリンクを付けて出力したいのですが上手くいきません。

例: <img src="./seiki_hyougen.gif" alt="正規表現についての説明">更に正規表現を知りたい方は、<a href="special.html">正規表現の詳しい説明</a>をクリックして下さい。

 ↓正規表現をキーワードにしてリンクを付けたい。

正:<img src="./seiki_hyougen.gif" alt="正規表現についての説明">更に<a href="seiki_hyougen.html">正規表現</a>を知りたい方は、<a href="special.html">正規表現の詳しい説明</a>をクリックして下さい。

誤:<img src="./seiki_hyougen.gif" alt="<a href="seiki_hyougen.html">正規表現</a>についての説明">更に<a href="seiki_hyougen.html">正規表現</a>を知りたい方は、<a href="special.html"><a href="seiki_hyougen.html">正規表現</a>の詳しい説明</a>をクリックして下さい。


尚、下記URLのサンプルを参考にしてスクリプトを作成しています。
http://php.oss.eznetsols.org/manual/ja/function.preg-split.php

$r = preg_split('((\/a>)|(<a))', $html, -1, PREG_SPLIT_DELIM_CAPTURE);
for ($i = 0; $i < count($r); $i++) {
if ($r[$i] == "<a") {
$i++; continue;
}
$r[$i] = preg_replace(
"/(正規表現)/i", "<a href='seiki_hyougen.html'>\\1</a>", $r[$i]
);
}
return join("", $r);

この(正規表現)の部分で上手い正規表現を使えばalt="×××"の中にリンクタグが入らないようにできるのでは?と思っているのですが・・・。

どうか、良い方法を教えて下さい。よろしくお願いいたします。

HTMLファイルを読み込み、特定の文字列にリンクを付けて出力したいのですが上手くいきません。

例: <img src="./seiki_hyougen.gif" alt="正規表現についての説明">更に正規表現を知りたい方は、<a href="special.html">正規表現の詳しい説明</a>をクリックして下さい。

 ↓正規表現をキーワードにしてリンクを付けたい。

正:<img src="./seiki_hyougen.gif" alt="正規表現についての説明">更に<a href="seiki_hyougen.html">正規表現</a>を知りたい方は、<a href="special.html">正規表現の詳しい説明...続きを読む

Aベストアンサー

ごめんなさい。複数のキーワードに対応しようとして
余計なことをしてしまいました。
訂正します。

<?php
$msg = <<<EOF
<img src="./seiki_hyougen.gif" alt="正規表現についての説明">更に正規表現を知りたい方は、<a href="special.html">正規表現の詳しい説明</a>をクリックして下さい。
EOF;

$links = array (
'正規表現' => '<a href="seiki_hyougen.html">正規表現</a>',
);

$link_keys = array_keys($links);
$link_values = array_values($links);

# 表示用関数
function printandreturn ($str) {
print stripslashes("$str");
return "";
}

function printwithlink ($str) {
global $link_keys, $link_values;
print str_replace($link_keys, $link_values, stripslashes($str));
return "";
}

# 処理開始

# 文字化け対策
$msg = str_replace("\\", "\\\\", $msg);

# メインループ
while (strlen($msg)) {
# アンカー部分をスキップ
if (strpos($msg, '<a') === 0) {
$msg = preg_replace("|^(.*?</a>)|e", "printandreturn ('$1')", $msg);
continue;
}
# タグ部分をスキップ
if ($msg[0] == '<') {
$msg = preg_replace("|^(<.*?>)|e", "printandreturn ('$1')", $msg);
continue;
}

# 次のタグまでをリンク付きで表示
foreach ($links as $key => $value) {
$msg = preg_replace("|^([^<]+)|e", "printwithlink ('$1')", $msg);
}
}
?>

ごめんなさい。複数のキーワードに対応しようとして
余計なことをしてしまいました。
訂正します。

<?php
$msg = <<<EOF
<img src="./seiki_hyougen.gif" alt="正規表現についての説明">更に正規表現を知りたい方は、<a href="special.html">正規表現の詳しい説明</a>をクリックして下さい。
EOF;

$links = array (
'正規表現' => '<a href="seiki_hyougen.html">正規表現</a>',
);

$link_keys = array_keys($links);
$link_values = array_values($links);

# 表示用関数
function printandr...続きを読む

Q(秀丸)正規表現で、変数¥1内より、""のみ削除

お世話になります。

秀丸エディタの正規表現で、
変数¥1内に、取得した文字列値が、
"1,234"
だった場合、
その変数値より、""(ダブルコーティション)のみを削除して、
変数¥1内に、
1,234
として、セットし直したいです。

そこでご質問させていただきますが、
既存の変数¥1内に取得する為の正規表現のところに対して、
さらに、
どのように正規表現を追記すれば、
上記しましたように、
変数¥1内に、
1,234
として、セットし直すことが出来ますでしょうか?

以上になります。
宜しくお願いいたします。

Aベストアンサー

たとえば正規表現を

"(1,234)"

とすると、

"1,234"

にヒットし、\1には

1,234

が入る。

本文文字列を
"1,234"1,2341,234
と書いておき、
"(1,234)"1,2341,234
または、
"(1,234)"\1\1
で同じ物がヒットすることで確認できる。

Q正規表現について

今lexのプログラムを書いているのですが、正規表現の部分でつまずいてしまいました。perlの正規表現なら分かるのですが、lexと少しかってが違い困っています。lexの正規表現でコメント(プログラム中で/**/で囲まれた部分)を読み飛ばす時には、どのような正規表現にしたら是非教えてください。なお/**/の中には文字列*/は出てこないと過程していいとのことでした。
解答お願い致します。

Aベストアンサー

>できるだけ正規表現で表したいのですが・・・面倒ですよね(笑)
それはなぜですか?
もし自分自身の興味としてそうしたいのであれば、解答をそのまま教えて欲しいということはないですよね。

>なお/**/の中には文字列*/は出てこないと過程していいとのことでした。

何かの課題で出されていている問題で、その解答が欲しい?

んじゃあ考え方のヒントだけ。

xy を含まないものにマッチする正規表現
http://www.din.or.jp/~ohzaki/regex.htm#WithoutXY

の応用です(というかそのまま)。
/\* ('*/' を含まない文字列) \*/
という正規表現を、上のURLの先で説明されているパターンを適用してやればできるでしょう。

Q秀丸の正規表現を使った置換について

秀丸エディターを使ってテキストの編集をしているのですが、正規表現を使って下記の様なテキストを削除したいのですが、方法はあるでしょうか?




様々なテキスト ~ 約100字程度





上記のように改行3個と改行4個に挟まれたテキストを全て削除したいので \n\n.*\n\n\n としてもダメなようで
記述方法をご教授下さい

Aベストアンサー

ほげほげ↲



様々なテキスト ~ 約100字程度↲




ふがふが↲

ってテキストのケツに改行がはいるので改行5つじゃない?
秀丸はよくわからないけど
「\n{3}.+?\n{4}」的な感じの処理だと思うけど・・・


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報