将2个带有正则表达式的preg_split应用于文本

时间:2016-09-22 13:47:45

标签: php regex expression preg-match preg-split

上下文: 我必须通过一系列规则拆分一封电子邮件,其中包含每天收到的几个客户的预订详细信息。这是电子邮件的一个示例:

A N K U N F T   11.08.15
*** NEUBUCHUNG ***
 11.08.15  xxx  xxx  X3 2830  14:25   17:50
 18.08.15  xxx  xxx  X3 2831  18:40
 F882129  dsdsaidsaia
 F882129  xxxyxyagydaysd
sadsdsdsdsadsadadssda
sadsdsdsdsadsadadssda
**«CUT HERE2»**


A N K U N F T   18.08.15
*** NEUBUCHUNG ***
 11.08.15  xxx  xxx  X3 2830  14:25   17:50
 18.08.15  xxx  xxx  X3 2831  18:40
 F881554  ZXCXZCXCXZCCXZ
 F881554  xcvcxvcxvcvxc
 F881554  xvcxvcxcvxxvccvxxcv

**«CUT HERE»**


11.08.15  xxx  xxx  X3 2830  14:25   17:50
 18.08.15  xxx  xxx  X3 2831  18:40
 F881605  xczxcdfsfdsdfs
 F881605  zxccxzxzdffdsfds

**«CUT HERE»**

因此,无论何时出现最后一个F999999(其中9可以是任何数字),基本上都必须进行切割,因为F999999是预约代码。* 我插入了文字:«CUT HERE»只是为了更好地了解切割的位置。

*注意:预订代码可能格式如下:F999999,A999999,E999999或999999。

所以我使用以下正则表达式应用一个有效的preg_split:

Regex1 = "/(?:\\s(F|A|E)?\\d{6}\\s?+.*?\r\n\\s?\r\n)\\K//ms";

然而,有时我必须剪切«CUT HERE2»出现的位置,因为有时在预订代码分隔符后面会有一些文字。

所以我创建了这个正则表达式:

Regex2 = "/^\h*(F|A|E)?\d{6}.*?\R{2}\K/ms"

然而,我有时会使用这种格式(相同预订的F999999之间的换行符),使我之前的正则表达式(regex2)切割成“不要在这里切割”:

A N K U N F T   11.08.15
*** NEUBUCHUNG ***
 11.08.15  xxx  xxx  X3 2830  14:25   17:50
 18.08.15  xxx  xxx  X3 2831  18:40
 F882129  dsdsaidsaia

<<NOT CUT HERE>>

 F882129  xxxyxyagydaysd
sadsdsdsdsadsadadssda
sadsdsdsdsadsadadssda
**«CUT HERE»**


A N K U N F T   18.08.15
*** NEUBUCHUNG ***
 11.08.15  xxx  xxx  X3 2830  14:25   17:50
 18.08.15  xxx  xxx  X3 2831  18:40
 F881554  ZXCXZCXCXZCCXZ

<<NOT CUT HERE>>

 F881554  xcvcxvcxvcvxc
 F881554  xvcxvcxcvxxvccvxxcv

**«CUT HERE»**


11.08.15  xxx  xxx  X3 2830  14:25   17:50
 18.08.15  xxx  xxx  X3 2831  18:40
 F881605  xczxcdfsfdsdfs
 F881605  zxccxzxzdffdsfds

**«CUT HERE»**

我只是希望它能够显示«CUT HERE»的位置。

此错误发生在例如:

***NEUBUCHUNG ***
 23.02.17  DUS  FNC  DE 1414  12:05   15:10
 09.03.17  FNC  DUS  DE 1415  16:40
 FNC011  Enotel Baia                  9360-215 Ponta do Sol
  1  DZ Typ I Meerblick 2Erw.         Frühstück
 am 03.10.16  CRS: MX  - PNR: 1290689
 Fluggeber: Condor Flugdienst / PNR: 1290689  Frühbucher 10%  inkl. Reiseleitung  und Transfer ab/bis   
 A025808  HERR Berg, Ulrich               62


<<NOT CUT HERE>

Anfrage.
 A025808  FRAU Berghaus, Petra            58

 **«CUT HERE»**

***S T O R N O **
 04.10.16 STR  X3 2810
 11.10.16 FNC  STR  X3 2811  18:15
FNC036    The Flame Tree               Funchal
 1  DZ Meerblick 2Erw.                 H
A987025  FRAU  BURG, GERTRUD          *** STORNO ***              O


<<NOT CUT HERE>>


A987025  HERR  BURG, WALTER           *** STORNO ***              O

**«CUT HERE»**

***ÄNDERUNG ***
NEU:01.11.16 FRA  X3 2806  13:35   16:50
08.11.16 FNC  FRA  X3 2807  17:40
   FNC813    Golden Residence/Wanderk. 9000-105 Funchal
 1  Suite seitl. Meerblick 3Erw.       F
A982512 FRAU   KROST, SIMONE
Frühbucher 15%


<<NOT CUT HERE>>

inkl. Reiseleitung
und Transfer ab/bis 
Im Reisepreis bereits enthalten: Drei
geführte Wanderungen (1 Ganztags- und 2
Halbtagswanderungen) inkl. aller
Transfers.

**«SHOULD CUT HERE»**

***ÄNDERUNG ***
ALT:01.11.16 FRA  X3 2806  13:35   16:50
08.11.16 FNC  FRA  X3 2807  17:40
FNC813   Golden Residence/Wanderk. 9000-105 Funchal
 1  Suite seitl. Meerblick 3Erw.   F
   A982512      HERR KROST, SIMONE 

**«CUT HERE»**


 25.04.17  DRS  FNC  ST 1602  13:25   17:15
 09.05.17  FNC  DRS  ST 1607  00:00
 FNC076  Baia Azul                    9004-530 Funchal
  1  DZ Typ I Meerblick 2Erw.         Halbpension
 am 03.10.16  CRS: MX  - PNR: 15326821
 Fluggeber: alltours / PNR: 15326821
 inkl. Reiseleitung
 und Transfer ab/bis Flughafen
 A025986  HERR Schulze, Steffen           55
 A025986  FRAU Schulze, Kerstin           54

**«CUT HERE»**

***S T O R N O **
 13.11.16 FRA  X3 2806
 20.11.16 FNC  FRA  X3 2807  17:35
FNC096    Pestana Village & Miramar    Funchal
 1  Studio 2Erw.                       H
A976918  FRAU  HEBING, BETTINA        *** STORNO ***              O

<<NOT CUT HERE>> 

A976918  HERR  HEBING, LUDGER         *** STORNO ***              O

  **«CUT HERE»**

我把«不要在这里»放在哪里分裂,但不应该。我把:«应该在这里剪切»它应该削减的地方。如果正确切割,我会把它“切到这里”。

1 个答案:

答案 0 :(得分:1)

您可以使用

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, CANCEL As Boolean)
    CANCEL = True
    If Target.Column = 2 Then
        Update.Show
        With Update.TextBox1.value = ?????
        End With
    End If
End Sub

请参阅regex demo

详细

  • '~^\h*F\d{6}.*?\R{2}\K~sm' - 开始行
  • ^ - 0+水平空格
  • \h* - F\d{6} + 6位数 - F - 任何0+字符,直到第一
  • .*? - 2次换行
  • \R{2} - 并省略整个匹配文字。

请参阅PHP demo

\K