お世話になります。

JSP内で、以下の正規表現で、文字列の行先頭と行末尾の
半角スペースを、置換を利用してTrim機能を実現しています。

var obj1 = document.getElementById("chaText").innerText;
var obj1b = obj1.replace(/^\s+|\s+$/g, "");
document.getElementById("chaText").innerHTML = obj1b;

そこでご質問させてください。
上記2行目において、
obj1.replace(/^\s+|\s+$/g, "");
という置換を実施していますが、
このreplace引数文字列の1文字目である
/(スラッシュ)文字の意味を教えてください。

(他の各文字列につきましては調べが付きましたが、
 この/(スラッシュ)文字を、ここに記述している意味だけが
 不明の為・・・)

以上になります。
よろしくお願い致します。

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

A 回答 (2件)

正規表現オブジェクト(RegExp)を生成するリテラルのようなものです。


var regExp = new RegExp("^\\s+|\\s+$","g")
var obj1b = obj1.replace(regExp, "");
と書くのと同じ意味になります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
おかげさまを持ちまして、良く理解できました。
また機会がございましたら、
よろしくお願いします。

PS:
いつもだと、いずれかの回答を
ベストアンサーで選択させていただいているのですが、
今回ご回答いただきましたお二人とも、
私にとりましては同じぐらいのベストアンサーだった為、
あえて今回はベストアンサーを選択しないで、
この質問を締め切らせていただきますので、
よろしくお願い致します。

最後になりますが、お二人とも、
本当にいつもお世話になっております。
ご回答ありがとうございました。

お礼日時:2011/04/28 10:01

JSPというか、該当部は事実上JavaScriptですかね?



正規表現が当たり前とも言える、Perl,Rubyなどの記法をそのまま受け継いだものですね。

/^\s+|\s+$/g

 / ^   \s+       |  \s+    $      / g
{ 行頭に続く空白1個以上 もしくは 空白1個以上(行末に続く) } を全て置換え対象とする。

  ↑すみません、空白の間隔がうまく調節できなくてずれてます(T T)
ぐらいの感じです。


まぁようするに /ほげほげ/ と2つ1組です。
言語によっては {ほげほげ} とか ~ほげほげ~ とか
人間が対と認知可能な相当多くの記号の組み合わせを受け入れているものもありあmす。

Perl、正規表現などの検索で調べたほうが早いかもしれないですね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
おかげさまを持ちまして、良く理解できました。
また機会がございましたら、
よろしくお願いします。

PS:
いつもだと、いずれかの回答を
ベストアンサーで選択させていただいているのですが、
今回ご回答いただきましたお二人とも、
私にとりましては同じぐらいのベストアンサーだった為、
あえて今回はベストアンサーを選択しないで、
この質問を締め切らせていただきますので、
よろしくお願い致します。

最後になりますが、お二人とも、
本当にいつもお世話になっております。
ご回答ありがとうございました。

お礼日時:2011/04/28 10:01

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

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

この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/

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

QJavaScriptの正規表現/?<.+?>/について

strからHTMLのタグを取り除いた文字列をxにしまうため
var x=str.replace(/<.+?>/g,"");
を使うそうですが
/<.+?>/g
をなぜ使うのかが分かりません
/<.+>/g
がまずいのは分かりますが・・・・

教えていただければ幸いです

Aベストアンサー

> 私の借りてきた本では「?の定義は直前の0回または1回の繰り返しにマッチ」となっていますが
> この定義からどう解釈すれば ? は、「最短マッチ」の指定になるのでしょうか?

? には2つの用法があり、その1つが「直前のパターンの、0回または1回の繰り返し」と呼ばれているものです。
? が * や + のような“繰り返し指定の直後”についている場合は「最短マッチ」の指定となります。

> 私の借りてきた本では「.は任意の1文字にマッチ」となっていますが
> これは¥nや特殊文字は含まないのでしょうか?

試してみれば分かることですが、. は \n のみマッチしません。
(\t など、他の特殊文字はOK)
内容が間違っている本、説明が不十分である本も結構ありますから、たくさんの本やサイトから情報を集め、自分で正しいものを見つけることが大事です。

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

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

Aベストアンサー

Perlなら

s/^(.....).*$/$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行で無理に解決した方が発展性には欠けますので、発展性やメンテナンス性を求めるならば、あまりこだわらない方がよいでしょう。

QJavascriptでの正規表現なのですが、以下の条件をチェックするにはどうすればいいのでしょうか?

Javascriptでの正規表現なのですが、以下の条件をチェックするにはどうすればいいのでしょうか?

(123)-123-1234 false
123 123 1234 false
123 123-1234 false
(123) 123 1234 false
123-123-1234 true
(123) 123-1234 true
(123)123-1234 true

どうぞよろしくお願いします。

Aベストアンサー

質問の例だけでは正確な条件が特定出来ませんが、
推測で、こんな感かな?

/^(\(\d{3}\) ?|\d{3}-)\d{3}-\d{4}$/

true の3パターン以外は全て false になると思います。

サンプル
-------------------------------------------------
<html>
<head>
<script language="JavaScript">
<!--
function test(){
if(form1.input1.value.match(/^(\(\d{3}\) ?|\d{3}-)\d{3}-\d{4}$/)){
form1.output1.value = "true";
}else{
form1.output1.value = "false";
}
}
//-->
</script>
</head>
<body>
<form name="form1">
データ<input name="input1" type="textbox"><br>
<input type=button value="比較" onClick="test()"><br>
結果<input name="output1" type="textbox">
</form>
</body>
</html>
-------------------------------------------------

これで不都合があるなら、その例を補足して下さい。

質問の例だけでは正確な条件が特定出来ませんが、
推測で、こんな感かな?

/^(\(\d{3}\) ?|\d{3}-)\d{3}-\d{4}$/

true の3パターン以外は全て false になると思います。

サンプル
-------------------------------------------------
<html>
<head>
<script language="JavaScript">
<!--
function test(){
if(form1.input1.value.match(/^(\(\d{3}\) ?|\d{3}-)\d{3}-\d{4}$/)){
form1.output1.value = "true";
}else{
form1.output1.value = "false";
}
}
//-->
</script>
</head>
<bod...続きを読む

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空白文字の正規表現

お世話になります。

StringクラスのreplaceAllを使用して、文字列に含まれる空白を削除しようとしているのですが、空白文字の正規表現がおかしいらしく「エスケープ・シーケンスが無効です」とエラー文が表示されてしまいます。

空白文字の正規表現は「\s(バックスラッシュs)」でよろしかったでしょうか?

使用しているjreは1.6.0でした。

ご回答お願いいたします。

Aベストアンサー

JavaのString中では、バックスラッシュバックスラッシュsです。

参考URL:http://gihyo.jp/book/2008/978-4-7741-3404-8

Q正規表現について

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

Aベストアンサー

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

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

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

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

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

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

Q正規表現/スペース以降改行までのグローバルマッチ

JavaScript正規表現で、「スペース1つ」以降「改行」までのグローバルマッチを行いたいのですが、うまくいきません。


■マッチさせたい内容
・年末なのに ここをマッチさせたい
・正規表現が ここもマッチさせたい
・ ここもマッチさせたい
・ここはマッチさせたくない
・ここはマッチさせたくない


■うまくいかない正規表現
/\s{1}.*[\n\r]/g

Aベストアンサー

行末を現す正規表現は $ を使います。
今回のケースでは、以下の正規表現でうまくいくと思います。
/\s.*$/g

※繰り返し数 {1} 記述は、普通は省略します。
※ちなみに、行頭を現す正規表現は ^ です。行頭・行末表現
 は利用頻度が高いので、ついでに覚えておかれると良いかと
 思います。


人気Q&Aランキング

おすすめ情報