1

我只有一个模式来匹配单词。标准是以下之一:

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

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

应该匹配

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

不应该匹配

test_Data3

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

[\p{^Alpha}]\S+

词内有特殊字符的词除外

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

4

2 回答 2

2

如果支持lookbehinds,您可以使用交替来匹配以下划线或数字开头,或者在另一种情况下匹配零次或多次而不是空白字符,至少是使用字符类的特殊字符,然后匹配零次或多次次不再是空白字符。

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

正则表达式演示

解释

  • (?<=\s|^)断言左边的内容是空白字符或字符串的开头的正向回溯
  • (?:启动非捕获组
    • [\d_]\S+匹配一个数字或下划线,然后匹配一次或多次而不是空白字符
    • |或者
    • \S*[%@#$]\S*匹配零次或多次非空白字符,然后匹配字符类中指定的内容,匹配零次或多次非空白字符
  • )关闭非捕获组
  • (?=\s|$)肯定的前瞻断言后面是空格字符或字符串的结尾
于 2018-09-23T09:43:47.867 回答
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;
}
于 2018-09-23T08:03:46.220 回答