正则表达式通过字符匹配模式
Regex match Pattern through Characters
我有一个模式:(^([-]?\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*?”只要有可能。
问题
我想知道有没有办法通过这些字符进行匹配。忽略它们的出现,只要你能说,如果它们不存在,模式就会匹配。
注:
输入字符串应匹配:((Decimal|Int),{6}(1|0),(Decimal|Int))
如果换行符出现在模式的末尾,则假设找不到更多输入。
我无法从输入字符串中删除这些字符,因为我需要知道它们在那里。
我不关心前导或尾随 spaces/new-lines
模式将始终以 "-"
或 "[0-9]"
开头(是的,0 可以是第一个字符)
模式总是以 [0-9]
结尾
编辑
这个正则表达式有效并通过了我的测试套件:(^(-?\s*[0-9]\s*[\s.0-9]*,){6}(\s*[10]\s*,)(\s*-?\s*[0-9][\s.0-9]*?)$)
如果您希望进行更多验证的测试,
这样比较合适。
然而,任何时候你穿插 white space \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 是一种方便的方法,可以从比赛中去除前导白色 space。
^
\s*
( # (1 start)
(?:
\s* [-]?
(?: \s* \d )+
(?:
\s* [.]
(?: \s* \d )+
)?
\s* ,
){6}
\s*
[10] \s* , \s*
[-]?
(?: \s* \d )+?
(?:
\s* [.]
(?: \s* \d )+?
)?
) # (1 end)
$
我有一个模式:(^([-]?\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*?”只要有可能。
问题
我想知道有没有办法通过这些字符进行匹配。忽略它们的出现,只要你能说,如果它们不存在,模式就会匹配。
注:
输入字符串应匹配:((Decimal|Int),{6}(1|0),(Decimal|Int))
如果换行符出现在模式的末尾,则假设找不到更多输入。
我无法从输入字符串中删除这些字符,因为我需要知道它们在那里。
我不关心前导或尾随 spaces/new-lines
模式将始终以 "-"
或 "[0-9]"
开头(是的,0 可以是第一个字符)
模式总是以 [0-9]
编辑
这个正则表达式有效并通过了我的测试套件:(^(-?\s*[0-9]\s*[\s.0-9]*,){6}(\s*[10]\s*,)(\s*-?\s*[0-9][\s.0-9]*?)$)
如果您希望进行更多验证的测试,
这样比较合适。
然而,任何时候你穿插 white space \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 是一种方便的方法,可以从比赛中去除前导白色 space。
^
\s*
( # (1 start)
(?:
\s* [-]?
(?: \s* \d )+
(?:
\s* [.]
(?: \s* \d )+
)?
\s* ,
){6}
\s*
[10] \s* , \s*
[-]?
(?: \s* \d )+?
(?:
\s* [.]
(?: \s* \d )+?
)?
) # (1 end)
$