我试图匹配所有以#开头的单词和2#之间的单词(参见示例)
var str = "#The test# rain in #SPAIN stays mainly in the #plain";
var res = str.match(/(#)[^\s]+/gi);
结果为["#The", "#SPAIN", "#plain"]
,但应为["#The test#", "#SPAIN", "#plain"]
额外:如果结果没有#。
会很好有人有解决方案吗?
答案 0 :(得分:4)
您可以使用
/#\w+(?:(?: +\w+)*#)?/g
请参阅demo here
正则表达式匹配:
#
- 哈希符号\w+
- 一个或多个字母数字和下划线字符(?:(?: +\w+)*#)?
- 出现一次或零次:
(?: +\w+)*
- 一个或多个空格出现零次或多次,后跟一个或多个单词字符,后跟#
- 哈希符号 注意:如果可能有字词以外的字符([A-Za-z0-9_]
范围内的字符),则可以将\w
替换为[^ #]
:
/#[^ #]+(?:(?: +[^ #]+)*#)?/g
请参阅another demo
var re = /#[^ #]+(?:(?: +[^ #]+)*#)?/g;
var str = '#The test-mode# rain in #SPAIN stays mainly in the #plain #SPAIN has #the test# and more #here';
var m = str.match(re);
if (m) {
// Using ES6 Arrow functions
m = m.map(s => s.replace(/#$/g, ''));
// ES5 Equivalent
/*m = m.map(function(s) {
return s.replace(/#$/g, '');
});*/ // getting rid of the trailing #
document.body.innerHTML = "<pre>" + JSON.stringify(m, 0, 4) + "</pre>";
}
&#13;
答案 1 :(得分:1)
你也可以试试这个正则表达式。
#(?:\b[\s\S]*?\b#|\w+)
(?:
打开non capture group以进行更改\b
匹配word boundary \w
匹配word character [\s\S]
匹配任何字符 See demo at regex101(与g
全球flag一起使用)