1

私はこの正規表現を使用しています:

var regex = /\<.*?.\>/g

この文字列と一致するには:

var str = 'This <is> a string to <use> to test the <regular> expression'

単純な一致を使用する:

str.match(regex)

そして、予想通り、私は得る:

["<is>", "<use>", "<regular>"]

(ただし、バックスラッシュがないと、混乱する可能性があります)

どうすれば逆の結果を得ることができますか? <つまり、との間に含まれるアイテムを返さない正規表現が必要>ですか?

/(^\<.*?\>)/g角かっこなどを含む他のさまざまな同様のコンボを試しました。素晴らしい結果がたくさんありますが、私が望んでいるものは何もありません。

これでどこに行くのか:基本的に、部分文字列の出現を検索して置換したいのですが、おそらく < と > を使用して、検索スペースの一部を除外したいと考えています。文字列をバラバラにしたり、変更したり、再構築することを心配したりしたくないので、破壊的な方法は本当に必要ありません。

もちろん、文字列を検索してこれを「手動で」行うこともできますが、正規表現でこれをうまく処理できるはずだと考えました。残念ながら、私の知識は必要な場所にありません!!

4

7 に答える 7

3

タグの外側のすべてをカスタム置換し、タグ付けされた部分からタグを取り除く方法は次のとおりですhttp://jsfiddle.net/tcATT/

var string = 'This <is> a string to <use> to test the <regular> expression';
// The regular expression matches everything, but each val is either a
// tagged value (<is> <regular>), or the text you actually want to replace
// you need to decide that in the replacer function
console.log(str.replace( /[^<>]+|<.*?>/g, function(val){
    if(val.charAt(0) == '<' && val.charAt(val.length - 1) == '>') {
      // Just strip the < and > from the ends
      return val.slice(1,-1);
    } else {
      // Do whatever you want with val here, I'm upcasing for simplicity
      return val.toUpperCase(); 
    }
} ));​
// outputs: "THIS is A STRING TO use TO TEST THE regular EXPRESSION" 

それを一般化するために、あなたは使うことができます

function replaceOutsideTags(str, replacer) {
    return str.replace( /[^<>]+|<.*?>/g, function(val){
        if(val.charAt(0) == '<' && val.charAt(val.length - 1) == '>') {
          // Just strip the < and > from the ends
          return val.slice(1,-1);
        } else {
          // Let the caller decide how to replace the parts that need replacing
          return replacer(val); 
        }
    })
}
// And call it like
console.log(
    replaceOutsideTags( str, function(val){
        return val.toUpperCase();
    })
);
于 2012-11-07T22:18:13.480 に答える
3

私の理解が正しければ、保護<されている部分 (とで囲まれている部分>) を除いて、文字列にカスタム処理を適用したいですか? その場合は、次のようにすることができます。

// The function that processes unprotected parts
function process(s) {
    // an example could be transforming whole part to uppercase:
    return s.toUpperCase();
}

// The function that splits string into chunks and applies processing
// to unprotected parts
function applyProcessing (s) {
    var a = s.split(/<|>/),
        out = '';

    for (var i=0; i<a.length; i++)
        out += i%2
                ? a[i]
                : process(a[i]);

    return out;
}

// now we just call the applyProcessing()
var str1 = 'This <is> a string to <use> to test the <regular> expression';
console.log(applyProcessing(str1));
// This outputs:
// "THIS is A STRING TO use TO TEST THE regular EXPRESSION"

// and another string:
var str2 = '<do not process this part!> The <rest> of the a <string>.';
console.log(applyProcessing(str2));
// This outputs:
// "do not process this part! THE rest OF THE A string."

基本的にはこれです。保護されていない部分が処理された文字列全体を返します。

<山かっこ (および)のバランスが取れていないと、分割が正しく機能しないことに注意してください>

改善できる箇所はいろいろありますが、それは読者への演習として残します。;p

于 2012-11-07T22:28:37.200 に答える
3

これは、正規表現引数をコアString.split()メソッドに渡すための完璧なアプリケーションです。

var results = str.split(/<[^<>]*>/);

単純!

于 2012-11-08T00:09:52.923 に答える
1

作成済みの変数を使用して、 を使用してみてくださいreplace。こちらも非破壊です。

str.replace(regex, '');
--> "This  a string to  to test the  expression"
于 2012-11-07T21:40:25.027 に答える
1
/\b[^<\W]\w*(?!>)\b/g

これはうまくいきます、それをテストしてください:

var str = 'This <is> a string to <use> to test the <regular> expression.';
var regex = /\<.*?.>/g;
console.dir(str.match(regex));
var regex2 = /\b[^<\W]\w*(?!>)\b/g;
console.dir(str.match(regex2));
于 2012-11-07T22:37:16.420 に答える
-1

ああ、わかりました、ごめんなさい-私はあなたの質問を誤解しました。javascriptはルックビハインドをサポートしていないため、これはjavascriptの純粋な正規表現で解決するのが難しい問題です。通常、これを解決するには先読みとルックビハインドを使用すると思います。それを行う(一種の工夫された)方法は次のようになります:

str.replace(/((?:<[^>]+>)?)([^<]*)/g, function (m, sep, s) { return sep + s.replace('test', 'FOO'); })

// --> "This <is> a string to <use> to FOO the <regular> expression"

これは、のような文字列でも機能し、replacer関数の代わりに"This test <is> a string to <use> to test the <regular> expression"使用すると、/test/g'test'

"This test <is> a string to <use> to test the test <regular> expression"

の中へ

"This FOO <is> a string to <use> to FOO the FOO <regular> expression"

アップデート

そして、このようなものは、<>文字も削除します。

str.replace(/((?:<[^>]+>)?)([^<]*)/g, function (m, sep, s) { return sep.replace(/[<>]/g, '') + s.replace(/test/g, 'FOO'); })

"This test <is> a string to <use> to test the test <regular> expression"
--> "This FOO is a string to use to FOO the FOO regular expression"
于 2012-11-07T21:47:25.397 に答える
-1

この正規表現を試してください:

\b\w+\b(?!>)

アップデート

括弧内のスペースをサポートするには、これを試してください。これは純粋な regex.match ではありませんが、機能し、上記の答えよりもはるかに簡単です。

alert('This <is> a string to <use use> to test the <regular> expression'.split(/\s*<.+?>\s*/).join(' '));
于 2012-11-07T21:53:07.973 に答える