【发布时间】:2021-10-24 09:19:28
【问题描述】:
我有一个模式:(^([-]?\d+([.]\d+)?,){6}([10],)([-]?\d+([.]\d+)?)$) 匹配:"26.9841,300.007666,4,1,0,15,1,0" 这是我想要的,但是我的模式与以下字符串不匹配:
"26 . 9841,300 . 007666,4,1,0,15,1,0""26.9841\n,300.007666\n,4,\n1,0,15,1,0""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