0

我正在尝试在 PHP 中创建以下正则表达式以匹配以下内容:

[2013-01-01 12:34:12.123] [USERNAME] something

我能够获得第一部分的一部分,但我是 php 中的正则表达式的新手,任何帮助表示赞赏。

重要提示:上面的任何空格都可以是一个空格或多个空格。

(这是我到目前为止得到的)

/^[\[][0-9]{4}-[0-9]{2}-[0-9]{2}]/

我正在使用这个工具来测试我的正则表达式匹配: http: //www.pagecolumn.com/tool/pregtest.htm(只是想确认它是一个好的工具)。

更新:为了更清楚起见,可以是任意数量的文本,上面的空格可以是任意数量的空白,而 USERNAME 也可以是任意数量的文本。

4

3 回答 3

1
\[\d{4}-\d{2}-\d{2}\s+[\d:.]+\]\s+\[\w+\]\s+something

http://rubular.com/r/BPGvFN4kwi

您没有具体说明您的规则。例如,第一部分可能需要是日期,但正则表达式可以匹配13月份。可以吗?还有什么是有效的“用户名”或“某事”?

于 2013-03-29T04:30:25.163 回答
1
/^\[([0-9]{4}-[0-9]{2}-[0-9]{2})\s+([0-9]+:[0-9]+:[0-9]+(?:\.[0-9]+)?)+\]\s+\[([^\]]+)\]\s+(.+)/

附评论:

/^
\[ # "[" is a special char and should be escape
    ([0-9]{4}-[0-9]{2}-[0-9]{2}) # Use brackets for group and capture (see $matches in php function)
    \s+ # One or move space chars (space, tab, etc.)
    ([0-9]+:[0-9]+:[0-9]+(?:\.[0-9]+)?)+ # "(?: )" is a group without capturing
\]
\s+
\[([^\]]+)\] # "[^\]]+" - one or more any char except "]"
\s+
(.+) # One or more any char
/x

PS:您可以使用“\d”而不是“[0-9]”并且(在这种情况下;为了灵活性)您可以使用“+”(“一个或多个字符”说明符)而不是“{4}”或“{2}”。

PPS: http: //www.pagecolumn.com/tool/pregtest.htm包含错误(不正确的反斜杠句柄),请尝试其他服务。

于 2013-03-29T05:03:23.437 回答
0

由于您的格式具有分隔符([]s),因此您不需要其他答案提供的检查。相反,您可以简单地使用

\[([^\]]*)\]\s+\[([^\]]*)\]\s+(.*)

分解为

\[([^\]]*)\] // Capture all non-] chars within [ and ]; this is the date
\s+ // some space
\[([^\]]*)\] // Capture all non-] chars within [ and ] again; this is USERNAME
\s+ // some space
(.*) // Capture all the text after; this is something

您可以使用Debuggex逐步完成此正则表达式。

于 2013-03-29T05:16:38.753 回答