当#符号位于两个字符串之间时,正则表达式模式应接受该字符串。假设ex_date( ds23d#d4ff5 )
应该接受字符串,但是,如果字符串是ex_date( asa#ss32as, #, s3ds#sdsd)
?在这种情况下,它不应接受该字符串。
我尝试过这种模式
/(([a-z0-9]#[a-z0-9]+(\s|\)|\,|$)))/
应该期望ex_date( d23sd#df32f )
而不是ex_date(as3a#ss4as, #, sd24s#sd56sd )
,因为中间的#符号是单独的,这意味着#之前和#之后没有字母数字字符。
规则:
如果字符串#-symbol中存在任何位置,则仅在
时字符串才可接受除非包含-(ROW,UROW,COL)之类的单词-ROW1,UROW,urow12,row,col1 col323,否则任何无效的#符号字符串都是有效的。
答案 0 :(得分:1)
答案 1 :(得分:1)
我们可以使用两种环视设计一些表达式:
您希望在字符串中看到的内容(使用交替和正向超前):
(?=^.*\b[a-z0-9][a-z]#[a-z][a-z0-9]\b.*$)
以及您不希望在字符串中看到的内容(使用交替和负前瞻):
(?!.*[0-9]#[0-9]|.*[a-z]#[0-9]|.*[0-9]#[a-z]|.*[\s,^]#[\s,^])
然后,我们将简单地合并它们:
^(?=^.*[a-z]#[a-z].*$|^.*\b[a-z0-9][a-z]#[a-z][a-z0-9]\b.*$)(?!.*[0-9]#[0-9]|.*[a-z]#[0-9]|.*[0-9]#[a-z]|.*[\s,^]#[\s,^]).*$
唯一的是我不确定规则,可以随意更改这些规则。
该表达式在regex101.com的右上角进行了解释,如果您想探索/简化/修改它,在this link中,您可以观察到它如何与某些示例输入匹配,如果你喜欢。
答案 2 :(得分:1)
您可以使用否定的前瞻来断言,右边的不是#
,它没有被a-z或0-9包围
^(?!.*(?:^|[^a-z0-9])#)(?!.*#(?:$|[^a-z0-9])).+$
const regex = /^(?!.*(?:^|[^a-z0-9])#)(?!.*#(?:$|[^a-z0-9])).+$/;
[
"ex_date( ds23d#d4ff5 ) ",
"ex_date( asa#ss32as, #, s3ds#sdsd) ",
"ex_date12(asa#ss32as,#,s3ds#sdsd) ",
"( asa#ss32as, a#b, s3ds#sdsd) ",
"date( asa#ss32as, #, s3ds#sdsd, a#b) ",
"ex_date( asa#ss32as, a#b, s3ds#sdsd, 4#5) ",
"ewe#ewe ",
"we#ere, er2e#er3e, # ",
"p_price(we#ee) ",
"p_date( we#rer , ) ",
"p_car ( df#e ,) ",
"re#ee , erer#r,",
"#wewqwq",
"ddf$%^#gfg^h",
].forEach(s => console.log(regex.test(s) + " ==> " + s));