3

我似乎无法使这个正则表达式工作。

输入如下。它确实在一行,但我在每个 \r\n 之后插入了换行符,以便更容易看到,因此不需要检查空格字符。

01-03\r\n
01-04\r\n
TEXTONE\r\n
STOCKHOLM\r\n
350,00\r\n            ---- 350,00 should be the last value in the first match
12-29\r\n
01-03\r\n
TEXTTWO\r\n
COPENHAGEN\r\n
10,80\r\n

这可能会在另一个 01-31 和 02-01 继续,标志着另一个新的比赛(这些是日期)。

我希望这个输入总共有 2 个匹配项。我的问题是我无法弄清楚如何向前看并匹配新比赛的开始(两个以下日期),但不包括在第一场比赛中的日期。他们应该属于第二场比赛。

这很难解释,但我希望有人能得到我。这是我到目前为止得到的,但还没有接近:

(.*?)((?<=\\d{2}-\\d{2}))

我想要的比赛是:

1: 01-03\r\n01-04\r\nTEXTONE\r\nSTOCKHOLM\r\n350,00\r\n
2: 12-29\r\n01-03\r\nTEXTTWO\r\nCOPENHAGEN\r\n10,80\r\n

之后,我可以轻松地用 \r\n 分隔列。

4

4 回答 4

3

这种更明确的模式对你有用吗?

(\d{2}-\d{2})\r\n(\d{2}-\d{2})\r\n(.*)\r\n(.*)\r\n(\d+(?:,?\d+))
于 2011-02-04T23:40:46.270 回答
2

这是您尝试的另一种选择:

(.+?)(?=\d{2}-\d{2}\\r\\n\d{2}-\d{2}|$)

红色的

于 2011-02-04T23:43:19.530 回答
1
/
   \G
   (
      (?:
         [0-9]{2}-[0-9]{2}\r\n
      ){2}
      (?:
         (?! [0-9]{2}-[0-9]{2}\r\n ) [^\n]*\n
      )*
   )
/xg
于 2011-02-04T23:44:30.430 回答
0

为什么要做这么多工作?

$string = q(01-03\r\n01-04\r\nTEXTONE\r\nSTOCKHOLM\r\n350,00\r\n12-29\r\n01-03\r\nTEXTTWO\r\nCOPENHAGEN\r\n10,80\r\n);
for (split /(?=(?:\d{2}-\d{2}\\r\\n){2})/, $string) {
   print join( "\t", split /\\r\\n/), "\n"
}

输出:

01-03   01-04   TEXTONE STOCKHOLM       350,00
12-29   01-03   TEXTTWO COPENHAGEN      10,80`
于 2011-02-05T00:22:21.037 回答