JavaScript regexp仅选择最后一次出现

时间:2015-06-01 06:59:00

标签: javascript regex regex-negation regex-lookarounds

仅选择最后一次出现

我试图选择最后一个单词(直到空格),这些单词是在最后white space@个字符之后。

以下是我的字符串

hello hi @why helo @blow but @name             // capture: name
hello hi @why helo @blow but name@name         // capture: blow

和另一个字符串

@blow but not know how to resolve this         // capture: blow

此处最后一次出现的是第一个单词blow,在单词后面只选择@(显然空格不在第一个单词中)。

我试过这个:https://regex101.com/r/pG1kU1/1

5 个答案:

答案 0 :(得分:2)

最简单的答案:

/\B@[^@]\w*(?!.*?\s@)/

请参阅DEMO

答案 1 :(得分:1)

你可以简单地使用否定前瞻:

@[^@]\w*(?!.*@[^@]\w*)

regex101 demo

(?:)表示在该点之后不能发生其中的正则表达式。所以这个正则表达式表明在匹配的项目之后,你找不到旁边的另一个@ -thing。这意味着它显然是最后的@ - 。

请注意:

@blow but not know how to resolve this@
^                                     ^
|                                     |
will match this one                   |
        because this is not a valid @/

选择@blow,因为@ - 根据你的正则表达式至少需要一个字符。如果您想匹配@部分,则需要将其修改为:

@[^@]?\w*(?!.*@[^@]?\w*)

或更高效

@[^@]?\w*(?!.*@)

如果@必须以字符串的开头或空格开头,则可以使用单词边界\B

\B@[^@]?\w*(?!.*\B@[^@]?\w*)

regex101 demo

答案 2 :(得分:1)

/(?<=^|\s)@[^@]\w*(?!.*\s@)/

应该工作;你的话将成为第一次捕获。在支持lookbehinds的语言中,你可以做

/\b@[^@]\w*(?!.*\s@)/

让整个捕获成为你所寻求的;但是在JavaScript中这是不可能的。

如果你对单词断言感到满意而不一定是空格,那么这也是有效的:

@word

我们的想法是在我们的比赛结束后确认没有进一步的<div ng-repeat="vehicle in filteredVehicle"> <input type="radio" name="radiog_lite" id="radio_{{$index}}" class="css-checkbox" ng-value="vehicle" ng-model="$parent.selectedVehicle" ng-disabled="vehicle.enable == '0'" /> <label for="radio_{{$index}}" class="css-label radGroup1" ng-if="vehicle.enable == '1'"></label> <h5>{{vehicle.vehicleTypeName}}</h5>

答案 3 :(得分:0)

(?:^| )@([^@\s]+)(?!.*?\s@\w+.*$)

你可以尝试一下。参见演示。

https://regex101.com/r/pG1kU1/3

答案 4 :(得分:0)

作为替代方案,这样的事情怎么样?

var strings = [
    'hello hi @why helo @blow but @name',
    'hello hi @why helo @blow but name@name',
    '  hello   hi   @why   helo    @blow    but    name@name  ',
    '@blow but not know how to resolve this',
    '  @blow   but   not   know   how   to   resolve   this',
    'tada',
    '    ',
    ''
];

var wanted = strings.map(function (element) {
    var found = 'not found';
    
    element.split(/\s+/).reverse().some(function (part) {
        if (part.charAt(0) === '@') {
            found = part.slice(1);
            
            return true;
        }
    });
    
    return found;
});

document.getElementById('out').textContent = wanted.join('\n')
<pre id='out'></pre>

没有复杂的RegExp,易于理解和改变行为。确实需要ES5或垫片,但没有biggy。