我们如何为ex_date(ddsf#dsd)编写正则表达式?

时间:2019-08-03 17:23:34

标签: javascript regex

当#符号位于两个字符串之间时,正则表达式模式应接受该字符串。假设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中存在任何位置,则仅在

时字符串才可接受
  • 如果#符号后跟数字--#12。
  • 如果没有单独出现#符号,例如#,(#),[#],###。
  • 如果#符号后面仅跟-dt这样的字符-如#DT或#dt或#dT或#Dt。
  • 如果#符号位于任意两个字母数字字符之间,例如w3e#ere,221#we4,er#rr,12#21。
  • 如果在#符号之前仅存在字母数字字符,则说出ew1#,ge#,12#。

除非包含-(ROW,UROW,COL)之类的单词-ROW1,UROW,urow12,row,col1 col323,否则任何无效的#符号字符串都是有效的。

3 个答案:

答案 0 :(得分:1)

假设ex_date( ds23d#d4ff5 )是应匹配内容的完整示例,我将正则表达式表达为:

ex_date\(\s*[a-z0-9]+#[a-z0-9]+\s*\)

Demo

答案 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,^]).*$

唯一的是我不确定规则,可以随意更改这些规则。


Demo

该表达式在regex101.com的右上角进行了解释,如果您想探索/简化/修改它,在this link中,您可以观察到它如何与某些示例输入匹配,如果你喜欢。

答案 2 :(得分:1)

您可以使用否定的前瞻来断言,右边的不是#,它没有被a-z或0-9包围

^(?!.*(?:^|[^a-z0-9])#)(?!.*#(?:$|[^a-z0-9])).+$

Regex demo

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));