1

我基本上有一个正在解析的数据流,这是它的典型格式:

格式 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+$

我忘了提,我正在寻找数据流中的*

4

5 回答 5

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+)
于 2013-07-30T19:55:27.980 回答
0

看起来输入之间的主要区别是在“00”之后有一个换行符。我相信你的正则表达式必须允许数字和冒号之间有空格字符的可能性。那需要在第三个“节”左右,这里:([\d:]+)

我会说这似乎是一个非常不标准的打破格式的地方,如果可能的话,可能值得向提供数据的人提及它,看看你是否可以让它保持一致。用换行符代替空格不会杀死你,因为你的正则表达式已经使用了一个可以识别这些的宏。

于 2013-07-30T19:57:02.810 回答
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*$

顺便说一句,格式 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*$

这是假设换行符总是出现在完全相同的位置。

于 2013-07-30T20:06:44.980 回答
0

捕获时间的捕获组;

 ([\d:]+)

...可以扩展以允许空格(也可以换行)

([\d\s:]+)

为了使解析更加健壮,您可能希望将日期限制为 8 或 9 个匹配项;

 ([\d\s:]{8,9})

请注意,生成的捕获组仍将包含换行符,因此您可能需要在使用它之前从捕获的时间中删除它。

于 2013-07-30T20:08:41.823 回答
0

为了扩展我的评论,我建议对一种格式使用一个正则表达式,而不是对多种格式使用多个正则表达式。如果可以的话,将您收到的所有字符串标准化为相同的格式。鉴于您的两个示例,您绝对可以做到这一点。

你在找什么?\s*

你用什么代替它?(一个空格)。

按照这个例子:正则表达式查找和替换

string output = Regex.Replace(input, "\s*", " ");

然后,在output.

于 2013-07-30T20:47:33.307 回答