2

文字列を解析し、角かっこで囲まれたものをスキップする正規表現を作成しようとしています。

何かのようなもの

string = "A bc defg hi [hi] jkl mnop.";

.match()は「hi」を返す必要がありますが、[hi]は返しません。私はREを5時間走り抜けましたが、タオルを投げています。

また、それが重要な場合、これはjavascriptまたはjquery用です。

どんな助けでも大歓迎です。また、質問を正しくフォーマットするように取り組んでいます:)

編集:

さて、私はちょうどエウレカの瞬間を持っていて、私が使用していた元の正規表現が実際に機能したことを理解しました。しかし、私が一致を[matches]に置き換えたとき、それは単に文字列の最初の一致を置き換えました...何度も繰り返しました。これは括弧をスキップすることを拒否した私の正規表現だと思いましたが、以下のほとんどすべての解決策を何度も試した後、私はハードコアをダーピングしていることに気付きました。

.replaceがその魔法を働いていたとき、それは最初の一致であったので、次のように結果の単語の最後にスペースを追加しただけです。

var result = string.match(regex);
var modifiedResult = '[' + result[0].toString() + ']';
string.replace(result[0].toString() + ' ', modifiedResult + ' ');

これにより、文字列内の元の単語をターゲットにするのをやめ、一致するたびに新しいブラケットのセットを追加するのをやめました。よろしくお願いします。私は正しい方向に私を導いた投稿に答えのクレジットを与えるつもりです。

4

7 に答える 7

3

RE の一致を試みる前に、括弧内のすべてを削除してターゲット文字列を前処理します

string = "A bc defg hi [hi] jkl mnop."
tmpstring = string.replace(/\[.*\]/, "")

次に、RE を tmpstring に適用します

修正:以下の nhahtd コメントごとにブラケット熱心な一致を作成し、RE をグローバルにしました

string = "A bc defg hi [hi] jkl mnop."
tmpstring = string.replace(/\[.*?\]/g, "")
于 2013-03-19T19:24:01.560 に答える
1

正規表現のみを使用すると、次を使用できます。

hi(?!])

例として。

否定後読みについてはこちらをご覧ください: http://www.regular-expressions.info/lookaround.html 残念ながら、javascript は否定後読みをサポートしていません。

http://regexpal.com/を使用してabcd[hi]jkhilmnop、テスト データhi(?!])として、検索する正規表現としてテストしました。'[hi]' に一致せずに 'hi' に一致しました。基本的に、後続の「]」文字がない限り、「hi」と一致しました。

もちろん、これは必要に応じて拡張できます。これには、文字列の前処理が必要ないという利点があります。

于 2013-03-19T19:27:32.097 に答える
1

これには必ずしも正規表現は必要ありません。文字列操作を使用するだけです。

var arr = string.split("[");
var final = arr[0] + arr[1].split("]")[1];

括弧で囲まれた式が複数ある場合は、ループを使用します。

while (string.indexOf("[") != -1){
    var arr = string.split("[");
    string = arr[0] + arr.slice(1).join("[").split("]").slice(1).join("]");
}
于 2013-03-19T19:18:15.977 に答える
0
r"\[(.*)\]"

正規表現を使用したい場合は、これをいじってみてください。

于 2013-03-19T19:22:20.730 に答える
0

あなたはそれで何をしたいですか?「ひ」以外の「ひ」部分を選択的に入れ替えたい場合は、避けたいものから見たいものに合わせるというシステムをよく使います。回避したいものと一致する場合は一致を返し、そうでない場合は処理済みの一致を返します。

このような:

return string.replace(/(\[\w+\])|(\w+)/g, function(all, m1, m2) {return m1 || m2.toUpperCase()});

指定された文字列で、次を返します。

"A BC DEFG HI [hi] JKL MNOP."

したがって、単語が角かっこで囲まれている場合 (m1 が空でない場合) を除いて、すべての単語が大文字に置き換えられます (m1 は空です)。

于 2013-03-19T19:45:40.253 に答える
0

これは、[ ] に含まれるすべての文字列の配列を作成します。

var regex = /\[([^\]]*)\]/;
var string = "A bc defg hi [hi] [jkl] mnop.";
var results=[], result;
while(result = regex.exec(string))
    results.push(result[1]);

編集

質問に答えるために、この正規表現は [ ] 内にあるものを除いた文字列を返し、空白を削除します。

"A bc defg [hi] mnop [jkl].".replace(/(\s{0,1})\[[^\]]*\](\s{0,1})/g,'$1')
于 2013-03-19T19:31:52.150 に答える
0

一致をスキップする代わりに、おそらく別のことを試すことができます-すべてに一致しますが、次のように角括弧内の文字列を(包括的に)キャプチャしないでください:

var r = /(?:\[.*?[^\[\]]\])|(.)/g;
var result;
var str = [];
while((result = r.exec(s)) !== null){
  if(result[1] !== undefined){ //true if [string] matched but not captured
    str.push(result[1]);
  }
}
console.log(str.join(''));

[string]最後の行は、パターンに一致しない文字列の部分を出力します。たとえば、入力で呼び出されると"A [bc] [defg] hi [hi] j[kl]u m[no]p."、コード"A hi ju mp."は空白をそのまま出力します。このコードでさまざまなことを試すことができます。たとえば、置換などです。

于 2013-03-19T22:26:54.580 に答える