PHP:复杂的多行RegEx,Tilde delimeters

时间:2016-01-29 13:53:20

标签: php regex preg-match

我需要生成一个符合以下格式的正则表达式:

-1 LKSJDF LSAALSKJ~
Syjsdf
lkjdf
This block may contain multiple characters including digits, colons, etc.  Any character other than a tilde.
 ~

我目前正在使用这个:

/(-\d|\d)\s([^$\~][a-zA-Z\s]*)\~\n/s

哪个匹配第一行罚款。我需要捕获开始模式的-1到60,空格之后的字直到第一个波形。然后,我需要捕获波形符号之间的所有文本。

首先,我并不是最强大的正则表达式,但是如果没有捕获波浪线,我就无法使用它。

1 个答案:

答案 0 :(得分:1)

您可以使用

'/^(-?\d+)\s+([^~]*)~([^~]+)~/m'

请参阅demo

正则表达式匹配:

  • ^ - 一行的开头(由于/m修饰符^不再与字符串的开头匹配)
  • (-?\d+) - (第1组)一个或零-后跟一个或多个数字
  • \s+ - 一个或多个空白符号(仅匹配制表符和常规空格,请改用\h+
  • ([^~]*) - (第2组)除~以外的零个或多个字符(您可以强制在第一行匹配这些字符,只需向否定字符添加\n\r class - [^~\n\r]
  • ~ - 字面意思的代字号
  • ([^~]+) - (第3组)除了波浪号
  • 之外的一个或多个字符
  • ~ - 文字尾随波浪号

如果您需要仅匹配这些字符串,如果数字是-1到60之间的整数,则可以使用

'/^(-1|[1-5]?[0-9]|60)\s+([^~]*)~([^~]+)~/m'

请参阅another demo

这里,第一组匹配-1到60的整数,其中(-1|[1-5]?[0-9]|60)交替组。 -160匹配文字数字,[1-5]?[0-9]匹配1或5的一个或零(可选)数字(如果允许前导零,则替换为[0-5]?)然后任何一个数字都可以跟随。