我基本上有一个我正在解析的数据流,这是它的典型格式:
格式1
07/11 04:05P 00:01:04 T204 *** P003 003 P003 5019207185 7666
有时数据格式会被调整,它采用以下格式:
格式2
07/11 04:05P 00
:01:04 T204 *** P003 003 P003 5019207185 7666
现在,适用于格式1的相同正则表达式将不适用于格式2.任何人都可以提供解释吗?请记住,我是正则表达式的新手,所以它可能只是一些非常愚蠢的东西。
这是我的正则表达式:
\s([\d/]+)\s([\d:AP]+)\s([\d:]+)\s([\dT]+)\s+([*]+)\s([PXTI\d]+)\s+([\d]+)?\s+([\da-zA-Z]+)\s+([\d]+)\s([\d]+)\s+$
我忘了提及,我正在寻找数据流中的 * 。
答案 0 :(得分:0)
您必须将此部分\s([\d:]+)\s
替换为\s(\d+\s*:\d+:\d+)\s
匹配两种格式的示例模式:
(\d{2}/\d{2})\s(\d{2}:\d{2}[AP])\s(\d{2}\s*:\d{2}:\d{2})\s(T\d+)\s+(\*+)\s+([PXTI]\d+)\s+([\d]+)?\s+(?i)([a-z]\d+)\s+(\d+)\s(\d+)
答案 1 :(得分:0)
输入之间的主要区别似乎是在" 00"之后有一个换行符。我相信你的正则表达式必须允许数字和冒号之间有空白字符的可能性。这需要在第三个" stanza",这里:([\d:]+)
。
我会说这似乎是一个非常不标准的地方,可以打破格式,如果可能的话,可能值得一提的是提供数据的人,看看你是否可以保持一致。用换行代替空格不会杀死你,因为你的正则表达式已经使用了一个可以识别那些的宏。
答案 2 :(得分:0)
我看不出你是如何在第一个上工作的。看起来第二个匹配组([\d:AP]+)
旨在匹配“04:05P”(或任何时间),但是因为你从 \ s 开始并且字符串没有开始使用空格,第一个匹配组匹配时间,并且从那里开始下坡。此外,您要求字符串以空格结尾,但您的示例都没有。我认为你想要的是在开头和结尾都有空格可选:
\s*([\d/]+)\s([\d:AP]+)\s([\d:]+)\s([\dT]+)\s+([*]+)\s([PXTI\d]+)\s+([\d]+)?\s+([\da-zA-Z]+)\s+([\d]+)\s([\d]+)\s*$
BTW,格式2是打算分成两行吗?如果是这样,您可以选择匹配换行符:
\s*([\d/]+)\s([\d:AP]+)\s([\d]+\n?[\d:]+)\s([\dT]+)\s+([*]+)\s([PXTI\d]+)\s+([\d]+)?\s+([\da-zA-Z]+)\s+([\d]+)\s([\d]+)\s*$
假设换行符总是在同一个地方。
答案 3 :(得分:0)
捕获时间的捕获组;
([\d:]+)
...可以扩展为允许空白(也是换行)
([\d\s:]+)
为了使解析更加健壮,您可能希望将日期限制为8或9个匹配项;
([\d\s:]{8,9})
请注意,生成的捕获组仍将包含换行符,因此您可能需要在使用前删除捕获的时间。
答案 4 :(得分:0)
为了扩展我的评论,我建议为一种格式使用一个正则表达式,而不是为多种格式使用多个正则表达式。如果可以,将您收到的所有字符串规范化为相同的格式。鉴于你的两个例子,你绝对可以做到这一点。
你在找什么?\s*
你在用什么代替它? (单个空格)。
请遵循以下示例:Regex find and replace
string output = Regex.Replace(input, "\s*", " ");
然后,在output
上运行原始正则表达式。