我只使用一种模式就能匹配单词。条件是以下之一:
它的第一个字母包含数字或下划线,或者
单词中至少一个特殊字符(不包括下划线):
应该匹配
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
答案 0 :(得分:2)
如果支持lookbehinds,则可以使用alternation来匹配下划线或数字,或者在其他情况下匹配零次或多次而不是空格字符,至少使用一个特殊字符类,然后匹配零次或多次而不是空白字符。
(?<=\s|^)(?:[\d_]\S+|\S*[%@#$]\S*)(?=\s|$)
说明
(?<=\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;
}