【问题标题】:How we can write a regular expression for ex_date(ddsf#dsd)?我们如何为 ex_date(ddsf#dsd) 编写正则表达式?
【发布时间】:2019-08-03 17:23:34
【问题描述】:

当 #-symbol 位于两个字符串之间时,正则表达式模式应该接受该字符串。假设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 是单独的意味着在# 之前和# 之后没有字母数字字符。

规则

如果字符串中的任何位置出现#-symbol,那么字符串只有在

时才可接受
  • 如果 #-symbol 后跟数字 - #12。
  • 如果#-symbol 不单独存在,如#、(#)、[#]、###。
  • 如果 #-symbol 后仅跟随字符 - “dt”,例如 - #DT 或 #dt 或 #dT 或 #Dt。
  • 如果 #-symbol 位于任意两个字母数字字符之间,例如 w3e#ere、221#we4、er#rr、12#21。
  • 如果在 #-symbol 之前仅存在字母数字字符,请说 ew1#、ge#、12#。

没有任何 #-symbol 的字符串是有效的,除非它不包含 (ROW , UROW 和 COL) 之类的单词 - ROW1, UROW, urow12, row, col1 col323 这些都是无效字符串。

【问题讨论】:

  • @Wiktor Stribizew 如果字符串中的任何位置#-symbol 存在,则字符串仅在以下情况下可接受 - a。如果 #-symbol 后跟数字 - #12。湾。如果#-symbol 不单独存在,如#、(#)、[#]、###。 C。如果 #-symbol 后仅跟随字符 - ‘dt’,例如 - #DT 或 #dt 或 #dT 或 #Dt。 d。如果#-symbol 位于任意两个字母数字字符之间,例如 w3e#ere、221#we4、er#rr、12#21。 e.如果在#-symbol 之前只存在字母数字字符,请说 ew1#、ge#、12#。
  • f.没有任何 #-symbol 的字符串是有效的,除非它不包含像 (ROW , UROW 和 COL) 这样的词 - ROW1, UROW, urow12, row, col1 col323 这些都是无效字符串。

标签: javascript regex


【解决方案1】:

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

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

Demo

【讨论】:

  • 但它也接受不正确的 ex_date( ds23d#d4ff5 , we# )。这里我只是举了一个例子 ex_date 函数可能包含任何参数,并且字符串也可能只是 wew12#wew 没有任何函数。
  • 我正在探索我的问题,以便您可以更好地理解 - 我想要一个接受的模式 - 1. 如果字符串中的任何位置存在 #-symbol ,那么只有在以下情况下才能接受字符串 -一种。如果 #-symbol 后跟数字 - #12。湾。如果#-symbol 不单独存在,如#、(#)、[#]、###。 C。如果 #-symbol 后仅跟随字符 - ‘dt’,例如 - #DT 或 #dt 或 #dT 或 #Dt。 d。如果 #-symbol 位于任意两个字母数字字符之间,例如 w3e#ere、221#we4、er#rr、12#21。
  • e.如果在#-symbol 之前仅存在字母数字字符,请说 ew1#、ge#、12#。 F。没有任何 #-symbol 的字符串是有效的,除非它不包含 (ROW , UROW 和 COL) 之类的词 - ROW1, UROW, urow12, row, col1 col323 这些都是无效字符串。
  • @Oliver Hao 你能告诉我如何编写一个只有在#-symbol 之后才会接受的模式,只有没有将接受。 #-symbol 可能存在多次,然后所有的地方 # 在 no 之后将只有有效,否则无效。假设 #12, #4545454, p(#34), d( #343, ) 都是有效的,但是 p(#12, #er) ,ol(#212er, ) , #2332 #445 #we23 所有这些都是无效的.
【解决方案2】:

您可以使用否定前瞻断言右边的不是 #,它不是被 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));

【讨论】:

  • 是的,它工作但不接受所有标准 - 让我们在下面的例子中说点 - 1, 4, 6, 7, 9, 10, 11, 12 仅有效,但全部无效,所以我想要这样的图案。 1. ex_date( ds23d#d4ff5 ) 2. ex_date( asa#ss32as, #, s3ds#sdsd) 3. ex_date12(asa#ss32as,#,s3ds#sdsd) 4. ( asa#ss32as, a#b, s3ds#sdsd ) 5. 日期( asa#ss32as, #, s3ds#sdsd, a#b) 6. ex_date( asa#ss32as, a#b, s3ds#sdsd, 4#5) 7. ewe#ewe 8. we#ere, er2e#er3e, # 9. p_price(we#ee) 10. p_date( we#rer , ) 11. p_car ( df#e ,) 12. re#ee , erer#r,
  • 在上面的正则表达式模式中,它也接受 #wewqwq, ddf$%^#gfg^h 这是错误的......只是我给你的例子我想要一个接受上述标准的模式
  • 让我再次告诉我的问题,我想要一个接受的模式 - 1. 如果字符串中的任何位置出现 #-symbol,那么字符串只有在以下情况下才能接受 - a.如果 #-symbol 后跟数字 - #12 b。如果#-symbol 单独存在,则单独存在,如#, (#), [#] c.如果 #-symbol 后仅跟随字符 - 'dt',例如 - #DT 或 #dt 或 #dT 或 #Dt d。如果#-symbol 位于任意两个字母数字字符之间,例如 w3e#ere、221#we4、er#rr、12#21。 e.如果在#-symbol 之前只存在字母数字字符,请说 ew1#、ge#、12#。
  • f.没有任何 #-symbol 字符串是有效的,除非它不包含像 (ROW , UROW 和 COL) 这样的词 - ROW1, UROW, urow12, row, col1 col323。一些有效而一些无效的例子——1. ex_date(ds23d#d4ff5) 2. ex_date( asa#ss32as, #, s3ds#sdsd) 3. ex_date12(asa#ss32as,#,s3ds#sdsd) 4. ( asa#ss32as, a#b, s3ds#sdsd) 5. 日期( asa#ss32as, #, s3ds#sdsd, a#b) 6. ex_date( asa#ss32as, a#b, s3ds#sdsd, 4#5 , ) 7. ewe#ewe 8. we#ere, er2e#er3e, #
  • 9. p_price( we#ee ) 10. p_date( we#rer , ) 11. p_car ( df#e ,) 12. re#ee , erer#r, 13. as# 14. 12sd# 15. #as2 16. #DT 17. Ewe 18. ROW1 19. Col 20. Col23 21. Ewecol 22. Ewerow12, 23. P_price() 在这些点中 - 1, 4, 6, 7, 9, 10, 11, 12, 13, 14, 16 , 17, 21, 22 和 23 只有效,其余无效。
【解决方案3】:

我们可以使用两个环视来设计一些表达式:

  • 您希望在字符串中看到的内容(使用交替和正向前瞻):

      (?=^.*\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 中查看它如何与一些示例输入匹配。

【讨论】:

  • 我通过更改正则表达式模式进行了测试和尝试,但我没有得到我想要的。我想要字符串是否包含任何否。字符串中的#-symbol 和#symbol 之前和#symbol 之后,如果它包含字母数字,那么它是有效的字符串,否则不是。
  • 在js脚本语言中
  • 你能告诉我如何编写满足所有有效情况的模式吗?
  • regex101.com/r/UdZKmE/1 在这个正则表达式模式中,它接受所有情况,除了你可以告诉你需要修改什么以便它也可以接受这种情况。当 #-symbol 不在两个字母数字字符之间时,那么在这种情况下,在 #only 数字和字符 DT 之后是有效的,而不是像 wew212#wew121 、 12we#121ew 这样的字母数字有效,但 #12we 、 #we12 、 rate(#we12) 是有效的无效,因为 # 之后它同时包含数字和字符
  • 其实这几天都被我屏蔽了所以不能提出新问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
相关资源
最近更新 更多