如何匹配包含特殊字符的整个单词?

时间:2018-09-23 07:52:43

标签: javascript regex oniguruma

我只使用一种模式就能匹配单词。条件是以下之一:

  • 它的第一个字母包含数字或下划线,或者

  • 单词中至少一个特殊字符(不包括下划线):

应该匹配

3testData
3test_Data
_testData
_test3Data
%data%
test%BIN%data
te$t&$#@daTa

不匹配

test_Data3

到目前为止,我已经设法通过以下方式匹配其中一些:

[\p{^Alpha}]\S+

单词中特殊字符除外

  

3testData
   3test_Data
   _testData
   _test3Data
  %data%
  测试%BIN%数据
  测试%BIN%数据
   te $ t&$#@ daTa

2 个答案:

答案 0 :(得分:2)

如果支持lookbehinds,则可以使用alternation来匹配下划线或数字,或者在其他情况下匹配零次或多次而不是空格字符,至少使用一个特殊字符类,然后匹配零次或多次而不是空白字符。

(?<=\s|^)(?:[\d_]\S+|\S*[%@#$]\S*)(?=\s|$)

Regex demo

说明

  • (?<=\s|^),肯定在左边的肯定是空格字符或字符串的开头
  • (?:启动非捕获组
    • [\d_]\S+匹配数字或下划线,然后匹配一次或多次而不是空格字符
    • |
    • \S*[%@#$]\S*匹配零次或多次而不是空白字符,然后匹配字符类中指定的内容,并且再次匹配零次或多次不是空白字符
  • )关闭非捕获组
  • (?=\s|$)积极前瞻,断言其后是空白字符或字符串的结尾

答案 1 :(得分:0)

如果我的问题正确,则您将搜索字符串的开始%和结束%。假设按字符串只有一种可能,则可以使用indexOf和lastIndexOf

function searchTagIn(symbol, str){ let chk=str.indexOf(symbol);
 if(  chk>-1){
  if(str.lastIndexOf(symbol)!=chk){
   return str.substring(chk,str.lastIndexOf(symbol);
  }
 }return;
}