1

我正在使用这个正则表达式:

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

匹配这个字符串:

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

使用简单的匹配:

str.match(regex)

并且,正如预期的那样,我得到:

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

(但没有反斜杠,抱歉任何潜在的混淆)

我怎样才能得到相反的结果?即我需要什么正则表达式不返回包含在<and之间的那些项目>

我尝试/(^\<.*?\>)/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

如果我理解正确,您想对字符串应用一些自定义处理,除了受保护<的部分(用and括起来>)?如果是这种情况,您可以这样做:

// 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."

基本上就是这样。它返回处理未受保护部分的整个字符串。

请注意,如果尖括号 (<>) 不平衡,拆分将无法正常工作。

有很多地方可以改进,但我会把它留给读者作为excersize。;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不支持lookbehinds,通常我认为我会使用lookaheads和lookbehinds来解决这个问题。一种(某种人为的)方法是这样的:

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

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

这也适用于类似的字符串"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 回答