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

How to match a whole word containing special characters?

我只使用一个模式来匹配单词。条件是以下之一:

应该匹配

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

不应该匹配

test_Data3

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

[\p{^Alpha}]\S+

除了单词里面有特殊字符的单词

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

如果我答对了,您可以在字符串中搜索开始的 % 和结束的 %。假设字符串只有一种可能,您可以使用 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;
}

如果支持 lookbehinds,您可以使用 alternation 来匹配以下划线或数字开头,或者在其他情况下匹配零次或多次非空白字符,至少是特殊字符使用字符 class 后跟匹配零次或多次而不是空白字符。

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

Regex demo

说明

  • (?<=\s|^) 正向后视断言左侧是空白字符或字符串的开头
  • (?:开始非捕获组
    • [\d_]\S+ 匹配数字或下划线后跟匹配一次或多次非空白字符
    • |
    • \S*[%@#$]\S* 匹配零次或多次非空白字符,然后匹配字符中指定的内容 class 并再次匹配零次或多次非空白字符
  • )关闭非捕获组
  • (?=\s|$) 断言后面是空白字符或字符串结尾的正向前瞻