【问题标题】:Regex match Pattern through Characters正则表达式通过字符匹配模式
【发布时间】:2021-10-24 09:19:28
【问题描述】:

我有一个模式:(^([-]?\d+([.]\d+)?,){6}([10],)([-]?\d+([.]\d+)?)$) 匹配:"26.9841,300.007666,4,1,0,15,1,0" 这是我想要的,但是我的模式与以下字符串不匹配:

  1. "26 . 9841,300 . 007666,4,1,0,15,1,0"
  2. "26.9841\n,300.007666\n,4,\n1,0,15,1,0"
  3. "2 6 . 9 8 4 1 ,\n 3 0 0 .0 0 7 6 6 6 , 4 \n, 1 , 0 , 1 5 , 1 , 0"

这是完全相同的字符串,只是添加了随机空格和换行符。

我可以用以下模式匹配那些:

(^([-]?\s*?\n*?[0-9 ]+\s*?\n*?(\s*?\n*?[.]\s*?\n*?[0-9 ]+\s*?\n*?)?\s*?\n*?,\s*?\n*?){6}([10]\s*?\n*?,)(\s*?\n*?[-]?\s*?\n*?[0-9 ]+\s*?\n*?([.]\s*?\n*?[0-9 ]+\s*?\n*?)?)$)

分别匹配1、2、3,但是这种模式很荒谬,很可能可以简化,并且不匹配所有新行; (它不会匹配 [0-9]+ (+) 块中出现的换行符)。它也只是拍打 "\s*?\n*?"尽可能地。

问题

我想知道是否有办法通过这些字符进行匹配。忽略它们的出现,只要你能说,如果它们不在那里,Pattern 就会匹配。

注意:

输入字符串应匹配:((Decimal|Int),{6}(1|0),(Decimal|Int))
如果模式末尾出现换行符,则假定找不到更多输入。
我无法从输入字符串中删除这些字符,因为我需要知道它们在那里。
我不关心前导或尾随空格/换行符
模式总是以"-""[0-9]" 开头(是的,0 可以是第一个字符)
模式总是以[0-9]结束

编辑

这个正则表达式有效并通过了我的测试套件:(^(-?\s*[0-9]\s*[\s.0-9]*,){6}(\s*[10]\s*,)(\s*-?\s*[0-9][\s.0-9]*?)$)

【问题讨论】:

  • 使用^-?[0-9][\s,.0-9]*[0-9]$
  • 这可行,但它应该只匹配:((Decimal|Int),{6}(1|0),(Decimal|Int))
  • 你可以使用^(\s*-?\s*(?:\d\s*)+(?:\.\s*(?:\d+\s*)+)?)(?:,(?1)){5},\s*[10]\s*,(?1)$ 之类的东西来重复第一个带有反向引用的子模式吗?
  • 自上而下的方框展示预期组(1、2、3);您匹配 1 的模式也包含一些 2。image
  • 如果您按照给定的链接,我的工作就很好。我是否在您的打印屏幕顶部看到不同的输入?

标签: regex pattern-matching newline spaces


【解决方案1】:

如果您希望进行更多验证的测试,
这样比较合适。
但是,只要您在正则表达式中散布空格 \s 构造
当这看起来像您的大部分数据时,将相似的集群 (?:\s*\d)+ 分开,
存在无法结束搜索的路径点的风险。
这个特殊的正则表达式可能会起作用。

^\s*((?:\s*[-]?(?:\s*\d)+(?:\s*[.](?:\s*\d)+)?\s*,){6}\s*[10]\s*,\s*[-]?(?:\s*\d)+?(?:\s*[.](?:\s*\d)+?)?)$

https://regex101.com/r/YmKJgW/1
捕获组 1 是一种从匹配中去除前导空白的便利。

 ^ 
 \s* 
 (                             # (1 start)
    (?:
       \s* [-]?  
       (?: \s* \d )+
       (?:
          \s* [.]  
          (?: \s* \d )+
       )?
       \s* ,
    ){6}
    \s* 
    [10] \s* , \s* 
    
    [-]?  
    (?: \s* \d )+?
    (?:
       \s* [.]  
       (?: \s* \d )+?
    )?
 )                             # (1 end)
 $

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2019-03-16
    • 2021-05-23
    • 1970-01-01
    相关资源
    最近更新 更多