具有多次重复的正则表达式

Posted

技术标签:

【中文标题】具有多次重复的正则表达式【英文标题】:Regex with multiple repetation 【发布时间】:2016-02-01 11:01:00 【问题描述】:

我现在很难使用正则表达式。

我能够在 Regexbuddy 中调试正则表达式,但不知何故它在 C#.net 中不起作用。

例如。

我的输入字符串:-

--8W1_805_431____0210_A01_0002_L--;%PE%R  
8.2.24,%MKUKATPBASIS,%CCOMMENT,%VNORMAL,%P 2: --8W1_805_431____0210_A01_0002_L--
;ENDFOLD  

;FOLD PTP SG003920 Vel=100 % PDAT5 ServoGun=8 Cont=OPN Part=2.65 mm WeldTimer=WTDAT1 Tool[1]:zc1 Base[1]:510wz1;%PE%R 4.1.25,%MKUKATPSERVOTECH,%CSpotTC,%VPTP,%P 1:PTP, 2:SG003920, 3:, 5:100, 7:PDAT5, 9:1, 11:1, 13:OPN, 15:2.65, 18:1, 21:0, 24:0, 27:5, 30:0, 33:WTDAT1
$BWDSTART=FALSE
PDAT_ACT=PPDAT5
FDAT_ACT=FSG003920
BAS(#PTP_PARAMS,100)
EG_SPOT_POINT_NAME[]="SG003920"
EG_EXTAX_ACTIVE=EG_SERVOGUN_EXAXIS[1]
EG_THICKNESS=2.65
EG_GUN_FORCE=1
EG_COMP_HELP=0
EG_COMPENSATE_PATH=0
EG_PROGRAM_NUMBER=003920
EG_HELPPOINT=EG_CHTIP(XSG003920)
PTP EG_HELPPOINT 
EG_APPROX_OPEN=FALSE
CMD=#SPOT
EG_SPOT_POINT=EG_HELPPOINT
EG_SPOT( WTWTDAT1 )  
PTP EG_HELPPOINT C_DIS
CMD=#STOP_POINT_END
EG_SPOT_POINT=EG_HELPPOINT
EG_SPOT( )

  ; --8W1_112_431____0210_A01_0001_L--;%PE%R 8.2

;FOLD PTP SG003918 Vel=100 % PDAT7 ServoGun=1 Cont=OPN Part=2.65 mm WeldTimer=WTDAT2 Tool[1]:zc1 Base[1]:510wz1;%PE%R 4.1.25,%MKUKATPSERVOTECH,%CSpotTC,%VPTP,%P 1:PTP, 2:SG003918, 3:, 5:100, 7:PDAT7, 9:1, 11:1, 13:OPN, 15:2.65, 18:1, 21:0, 24:0, 27:5, 30:0, 33:WTDAT2
$BWDSTART=FALSE
PDAT_ACT=PPDAT7
FDAT_ACT=FSG003918
BAS(#PTP_PARAMS,100)
EG_SPOT_POINT_NAME[]="SG003918"
EG_EXTAX_ACTIVE=EG_SERVOGUN_EXAXIS[1]
EG_THICKNESS=2.65
EG_GUN_FORCE=1
EG_COMP_HELP=0
EG_COMPENSATE_PATH=0
EG_PROGRAM_NUMBER=003918
EG_HELPPOINT=EG_CHTIP(XSG003918)
PTP EG_HELPPOINT 
EG_APPROX_OPEN=FALSE
CMD=#SPOT
EG_SPOT_POINT=EG_HELPPOINT
EG_SPOT( WTWTDAT2 )
PTP EG_HELPPOINT C_DIS
CMD=#STOP_POINT_END
EG_SPOT_POINT=EG_HELPPOINT
EG_SPOT( )
;ENDFOLD


Regex Pattern:- --(?<PName>8W.*?)--.*?(?<MType>PTP|LIN).*?(?<PointNa>SG) 

组 PName 的输出必须是这样的。

8W1_112_431____0210_A01_0001_L

8W1_805_431____0210_A01_0002_L

当我在 c# 中运行这个正则表达式时,它的返回总是 false。

请任何人指导我这里出了什么问题。

提前致谢。

【问题讨论】:

我使用的模式是:正则表达式模式:- --(?8W.*?)--.*?(?PTP|LIN).*?(? SG) 在开头添加(?s)。或使用RegexOptions.Singleline @WiktorStribiżew 为什么使用“RegexOptions.Singleline” 我在输入字符串中有多行 它是 C#,而不是 Ruby,所以 (?s) - “单行”修饰符 - 使 . 匹配换行符。不注意命名,总是误导。 见ideone.com/loBDnB 【参考方案1】:

解决方法很简单:在开头添加(?s)。或者将RegexOptions.Singleline 标志与Regex.Match 一起使用。

见IDEONE demo

你需要了解regex modifiers in .NET regex的作用:

RegexOptions.Singleline - 指定单行模式。更改点 (.) 的含义,使其匹配每个字符(而不是除 \n 之外的每个字符)。有关详细信息,请参阅Regular Expression Options 主题中的“单行模式”部分。

RegexOptions.Multiline - 多行模式。更改^$ 的含义,使其分别匹配任何行的开头和结尾,而不仅仅是整个字符串的开头和结尾。有关详细信息,请参阅Regular Expression Options 主题中的“单行模式”部分。

另外,请参阅Difference between regular expression modifiers 'm' and 's'?

【讨论】:

以上是关于具有多次重复的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式---重复

正则表达式

Python正则表达式(一看就懂)

Python标准库01正则表达式

.NET中具有重复字符和长度的正则表达式

python 正则表达式