我试图选择最后一个单词(直到空格),这些单词是在最后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
,在单词后面只选择@
(显然空格不在第一个单词中)。
答案 0 :(得分:2)
答案 1 :(得分:1)
你可以简单地使用否定前瞻:
@[^@]\w*(?!.*@[^@]\w*)
(?:)
表示在该点之后不能发生其中的正则表达式。所以这个正则表达式表明在匹配的项目之后,你找不到旁边的另一个@ -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*)
答案 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)
答案 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。