Resumen de sintaxis de expresiones regulares de Perl

Caracteres especiales

. [ { ( ) \ * + ? | ^ $

comodín .

Coincide con cualquier carácter cuando se usa fuera de un conjunto de caracteres.

punto de anclaje

'^'El carácter coincidirá con el comienzo de la línea.
'$'El carácter coincide con el final de la línea.

subexpresión etiquetada

Las partes intermedias ()son subexpresiones marcadas y el algoritmo de coincidencia separará la parte coincidente de la subexpresión en partes independientes. Las subexpresiones marcadas se pueden repetir o hacer referencia a ellas.

grupo no marcado

Las subexpresiones marcadas son útiles para agrupar partes literales de expresiones regulares, pero agrupar los resultados tiene efectos secundarios. Alternativamente, se puede hacer  (?: expression)generando agrupaciones literales, pero sin subexpresiones etiquetadas, como  (?:ab)+ repetir  ab pero no separar subexpresiones individuales.

repetir

Se pueden repetir átomos arbitrarios (un solo carácter, una subexpresión etiquetada o un grupo de caracteres) mediante los  operadores   , * . +?{}

operador ilustrar
* coincide con el átomo anterior cero o más veces
+ coincide con el átomo anterior una o más veces
? coincide con el átomo anterior cero o una vez
{norte} coincide con el átomo anterior n veces
{norte,} coincide con el átomo anterior n o más veces
{Nuevo Méjico} Haga coincidir el átomo anterior entre n y m veces

Nota: Es un error utilizar el operador de repetición si la estructura anterior no se puede repetir:
por ejemplo, un(*) informará un error.

repetición no codiciosa

gramática ilustrar
*? Coincide con el átomo anterior cero o más veces, pero consume la menor cantidad de entrada posible
+? coincide con el átomo anterior una o más veces, pero consume la menor cantidad de entrada posible
?? Coincide con el átomo anterior cero o una vez, pero consume la menor cantidad de entrada posible
{norte,}? Coincide con el átomo anterior no más veces, pero consume la menor cantidad de entrada posible
{Nuevo Méjico}? Coincide con el átomo anterior n a m veces, pero consume la menor cantidad de entrada posible

repetición pocesiva

De forma predeterminada, cuando no se puede encontrar una coincidencia con un patrón repetido, el motor retrocederá hasta encontrar una coincidencia. Sin embargo, en ocasiones este comportamiento no es deseado por el usuario, por lo que también se produce una especie de repetición "pocesiva": coincide tanto como sea posible y no permite retroceder cuando las expresiones restantes no pueden coincidir.

gramática ilustrar
*+ coincide con el átomo anterior cero o más veces, pero no regresa
++ coincide con el átomo anterior una o más veces sin retroceder
?+ coincide con el átomo anterior cero o una vez, pero no retrocede
{n,}+ Coincide con el átomo anterior no más veces, pero no regresa
{n,m}+ Coincide con el átomo anterior n a m veces sin retroceder

referencia posterior

  • Un carácter de escape seguido de un número \n, el rango de n es 1-9, coincide con la misma cadena que coincide con la subexpresión n, como por ejemplo: ^(a*).*\1$coincide  aaabbaaapero no coincideaaabba
  • \gEscapadas:
gramática ilustrar
\g1 coincide con el contenido de la subexpresión 1
\g{1} Haga coincidir el contenido de la subexpresión 1: una forma más segura como \g{1234} o \g{1}2
\g-1 coincide con el contenido de la última subexpresión abierta
\g{-2} coincide con el contenido de la penúltima subexpresión abierta
\desaparecido} coincide con oneel contenido de la subexpresión denominada
  • \kLos escapes se pueden utilizar para citar subexpresiones nombradas, ya que \k<two>coincidirán con twoel contenido de una subexpresión denominada

elegir

  • | El operador coincide con uno de sus argumentos, por ejemplo  abc|def coincidiría con "abc" o "def".
  • Los paréntesis se pueden utilizar para agrupar selecciones, por ejemplo: ab(d|ef) coincidiría con "abd" o "abef".
  • No se permiten selecciones vacías (esto suele ser un error), pero si realmente necesita una selección vacía, puede usarla  (?:) como marcador de posición, como por ejemplo:
    • |abc no es una expresión válida, pero
    • (?:)|abc es una expresión válida y es idéntica a las siguientes expresiones:
    • (?:abc)?? tiene exactamente el mismo efecto

conjunto de caracteres

Un conjunto de caracteres es una []expresión entre corchetes que define un conjunto de caracteres y coincide con cualquier carácter del conjunto. Contiene las siguientes combinaciones:

  • Un solo carácter: como [abc] puede coincidir con 'a', 'b' o 'c'.
  • Rango de caracteres: como [ac] puede coincidir con cualquier carácter en el rango de 'a' a 'c'.
    Para las expresiones regulares predeterminadas de Perl, se dice que un carácter x está en el medio del rango y a z si su valor codificado está entre los valores codificados de los caracteres y y z en cualquier extremo del rango. Además, si el indicador de clasificación se establece al construir la expresión regular  , el alcance depende de la configuración regional.
  • Negación: si la expresión entre corchetes  ^ comienza con un carácter, entonces coincide con el complemento del carácter contenido, como por ejemplo: [^a-c]coincide con cualquier carácter que no esté en el rango de a a c.
  • Clase de carácter: una [[:name:]]expresión del formulario coincide con la clase de carácter denominada "nombre", es decir, cualquier [[:lower:]]carácter en minúscula. Consulte la tabla de nombres de clases de personajes.
  • Elemento de intercalación Una expresión del
    formulario  [[.col.]] coincide con un elemento de intercalación  /col/. Un elemento de intercalación es cualquier carácter individual o secuencia de caracteres correspondientes a una sola unidad. Los elementos de clasificación también se pueden utilizar como puntos finales de rango, por ejemplo,  [[.ae.]-c] para hacer coincidir la secuencia de caracteres "ae" y cualquier carácter individual en el rango "ae" con c. donde "ae" es tratado como un único elemento de intercalación por la configuración regional actual. Como extensión, los elementos de intercalación se pueden especificar por sus nombres simbólicos , por ejemplo,
    [[.NUL.]] para que coincidan con un  \0 carácter.
    (Las siguientes se consideran ligaduras legales cuando se utilizan como nombres de elementos contrastantes:
    "ae", "Ae", "AE", "ch", "Ch", "CH", "ll", "Ll", "LL", "ss", "Ss", "SS", "nj", "Nj", "NJ", "dz", "Dz", "DZ", "lj", "Lj", "LJ". )
  • Clase de equivalencia
    Una  [[=col=]] expresión del formulario coincide con  col cualquier carácter o elemento de clasificación cuya  clave de clasificación principal sea equivalente a col un elemento de clasificación cuyo nombre sea un nombre simbólico. Las claves de clasificación primarias ignoran las mayúsculas y minúsculas, los acentos o las adaptaciones específicas de la región; por ejemplo,  [[=a=]] coinciden con los siguientes caracteres: a, À, Á, Â, Ã, Ä, Å, A, à, á, â, ã, ä 和 å. Lamentablemente, la implementación depende de la plataforma en cuanto al soporte de intercalación y localización; esta característica no funciona muy bien de forma portátil en todas las plataformas, ni siquiera en todas las configuraciones regionales de una plataforma.
  • Caracteres de escape
    Cualquier secuencia de escape que coincida con un solo carácter o una sola clase de carácter se puede definir en una clase de carácter. Por ejemplo, [\[\]] puede coincidir con  [ o  ] , pero  [\W\d]puede coincidir con cualquier carácter de "número" o cualquier carácter que no sea una "palabra".
  • Combinando: Todo lo anterior se puede combinar en una declaración de clase de carácter, por ejemplo  [[:digit:]a-c[.NUL.]].

Escapadas

  • Cualquier carácter especial precedido por un carácter de escape coincide consigo mismo.
  • Las siguientes secuencias de escape son sinónimos de caracteres individuales.
Escapadas personaje
\a \a
\mi 0x1B
\F \F
\norte \norte
\r \r
\ t \ t
\v \v
\b \b (usado sólo en declaraciones de clases de caracteres)
\cX Una secuencia de escape ASCII con el código de carácter punto X % 32
\xdd Una secuencia de escape hexadecimal que coincide con un solo carácter con el punto de código 0xdd.
\x{dddd} Una secuencia de escape hexadecimal que coincide con un solo carácter con el punto de código 0xdddd.
\0ddd Una secuencia de escape octal que coincide con un solo carácter con el punto de código 0ddd.
\N{nombre} Coincide con un solo carácter cuyo nombre de símbolo es nombre.
  • clase de carácter de "un solo carácter"
secuencia de escape Equivalente a
\d [[:dígito:]]
\l [[:más bajo:]]
\s [[:espacio:]]
\u [[:superior:]]
\w [[:palabra:]]
\h espacio en blanco horizontal
\v espacio vertical
\D [^[:dígito:]]
\L [^[:inferior:]]
\S [^[:espacio:]]
\U [^[:superior:]]
\W [^[:palabra:]]
\H 非水平空白
\V 非垂直空白
  • 字符属性
    下面表格中的字符属性名称都等价于字符类中使用的名字。
形式 说明 等价的字符集形式
\pX 匹配任意具有属性X的字符 [[:X:]]
\p{Name} 匹配任意具有属性Name的字符 [[:Name:]]
\PX 匹配任意不具有属性X的字符 [^[:X:]]
\P{Name} 匹配任意不具有属性Name的字符 [^[:Name:]]

例如 \pd 匹配任意的”数字”字符,和 \p{digit} 作用是一样的。

  • 单词边界
    下面的转义序列匹配单词的边界:
    \< 匹配单词的起点
    \> 匹配单词的终点
    \b 匹配单词的边界(起点或终点)
    \B 只有不在边界时才匹配。
  • 缓冲区边界
    下面的转义序列匹配缓冲区边界:这里的”缓冲区”指用于匹配的全部输入文本(注意,^和$可以用于匹配文本中的行)。
    • ` 匹配缓冲区的起点。
    • ' 匹配缓冲区的终点。
    • \A 匹配缓冲区的起点(同 \` 一样)。
    • \z 匹配缓冲区的终点(同 \’ 一样)。
    • \Z 匹配一个零长度的断言,包括缓冲区结尾处可能存在的空行:等价于正则表达式 (?=\v*\z)。注意,这与 Perl 中匹配 (?=\n?\z) 的行为有一些微妙的不同。
  • 持续转义
    序列 \G 只在上次匹配结尾或匹配文本的起点(如果前面没有匹配)。 当你要迭代文本中所有的匹配,并且每个子序列都从上一次结束时开始匹配的话,这个转义是很有用的。
  • 引用转义 转义序列 \Q 开始一个”被引用序列”:所有后面的字符都被当作字面对待,除非正则表达式结束或碰到 \E。 例如,表达式:\Q\*+\Ea+ 可以匹配如下:
    • *+a
    • *+aaa
  • Unicode转义
    • \C 匹配一个单一的码表:在 Boost.Regex 中这和”.”操作符的作用是完全相同的。
    • \X 匹配一个组合字符序列:任意非组合字符跟上一个零或多个组合字符的序列。
  • 匹配行末符
    转义序列 \R 匹配任何行末符序列,特别地,它等同于表达式 (?>\x0D\x0A?|[\x0A-\x0C\x85\x{2028}\x{2029}]).
  • 回退一些文本
    \K 将$0的开始位置重置为当前文本位置:换言之,\K 左边的所有东西被”退回”且不作为该正则表达式的匹配部分。 $ 也被相应更新。 例如,foo\Kbar 用于匹配文本 "foobar" 时,将对 $0 返回匹配 "bar",对 $ 返回 “foo”。 这可以被用于模拟可变宽度的后向环视断言。
  • 其他转义 其它转义序列匹配被转义的字符,例如 \@匹配 ‘@’。

Perl 扩展模式

Perl扩展的正则表达式语法都以 (? 开始。

  • 命名子表达式:(?<NAME>expression),或者 (?'NAME'expression),引用命名子表达式: 通过\g{NAME} 或 \k<NAME>后向引用。
  • 注释:(?# ... ) 作为注释,里面的内容被忽略。
  • 修饰: (?imsx-imsx ... ) 改变在模式中perl修饰符是否起作用,从块第一次被遇到的点开始起作用,直到遇到结束 =)=。 ‘-‘ 之前的字母打开perl修饰符,后面的字母关闭。
    (?imsx-imsx:pattern) 只将特定的修饰符应用于指定的模式。
  • 非标记分组 :(?:pattern) 进行字面分组,但不产生额外的子表达式。
  • 分支重置: (?|pattern) 在 pattern 内的每个 “ ” 选择符开始重置子表达式计数。该结构之后的子表达式计数由具有最大子表达式数量的分支决定。当你想用单个子表达式索引捕获多个可选匹配之一的时候,可使用该结构。例如:
/ ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x  
# 1            2         2  3        2     3     4
  • 前向匹配
    • (?=pattern) 当模式匹配时成功,但不消耗字符
      (?=exp)也叫“零宽度正预测先行断言”,它断言自身出现的位置的后面能匹配表达式exp,比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
    • (?!pattern) 当模式不匹配时成功,但不消耗字符。 “零宽度负预测先行断言”(?!exp),断言此位置的后面不能匹配表达式exp。例如: \d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;
      \b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。
      前向匹配的典型用法是创建两个正则表达式的逻辑与,例如一个密码必须包含一个小写字符,一个大写字符,一个标点符号,长度至少6个字符,那么表达式是:
      (?=.*[[:lower:]])(?=.*[[:upper:]])(?=.*[[:punct:]]).{6,}
  • 后向匹配
    • (?<=pattern) 只有当模式能够被当前位置之前的字符匹配时才成功(模式必须是固定长度),但并不消耗字符。 (?<=exp)也叫“零宽度正回顾后发断言”,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
    • (?<!pattern) 只有当模式不能够被当前位置之前的字符匹配时才成功(模式必须是固定长度),但并不消耗字符。 “零宽度负回顾后发断言” (?<!pattern),来断言此位置的前面不能匹配表达式exp:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字
  • 独立子表达式
    (?>pattern) pattern 独立于外围模式地被匹配,表达式决不会被回溯到 pattern 中。 独立子表达式通常用于改善性能;只有最好可能的匹配才会被考虑,如果表达式不能作为整体被匹配,那就没有匹配。
  • 递归表达式
    • (?N) (?-N) (?+N) (?R) (?0)
    • (?R) and (?0) 递归至整个模板的开始。
    • (?N) 重复执行子表达式/N/,例如 (?2) 将递归至子表达式2。
    • (?-N) 和 (?+N) 是相对递归,因此如 (?-1)将递归至被声明的最后一个子表达式,而 (?+1) 则递归至被声明的下一个子表达式。
  • 条件表达式
    • (?(condition)yes-pattern|no-pattern) 当 condition 成立时试图匹配 /yes-pattern/,否则试图匹配 /no-pattern/。
    • (?(condition)yes-pattern) 当 condition 成立时试图匹配 /yes-pattern/,否则直接失败。
    • condition 可以是一个前向匹配断言,或者是一个标记子表达式序号(当子表达式匹配时条件为真),或是一个递归的索引(当我们在指定递归中直接执行时条件为真)。
    • 可能的谓词:
      • (?(?=assert)yes-pattern|no-pattern) 如果前向匹配成功则执行 /yes-pattern/,否则执行 /no-pattern/。
      • (?(?!assert)yes-pattern|no-pattern) 如果前向匹配不成功则执行 /yes-pattern/,否则执行 /no-pattern/。
      • (?(R)yes-pattern|no-pattern) 如果是在某个递归的内部执行,则执行 /yes-pattern/,否则执行 /no-pattern/。
      • (?(RN)yes-pattern|no-pattern) 如果是在某个到子表达式/N/的递归内部执行,则执行 /yes-pattern/,否则执行 /no-pattern/。
      • (?(DEFINE)never-exectuted-pattern) 定义一个从不执行也不匹配任何字符的代码块: 通常用于定义一个或多个从模板其它地方引用的命名子表达式。

操作符优先级

  • 对照相关的方括号字符 [==] [::] [..]
  • 转义字符 \
  • 字符集(方括号表达式) []
  • 分组 ()
  • 单字符-ERE重复 * + ? {m,n}
  • 连接
  • 锚点 ^$
  • 选择 |

最优匹配

如果将正则表达式当作有向(可能循环)图,那么最优匹配就是在匹配输入文本过程中按照深度优先搜索找到的第一个匹配。

字符类名称表

名称 是否POSIX标准名称 说明
alnum yes 任意 单词-数字 字符
alpha yes 任意单词字符
blank yes 非行分隔符的任意空白字符
cntrl yes 任意控制字符
d no 任意数字字符
digit yes 任意数字字符
graph yes 任意图形字符
l no 任意小写字符
lower yes 任意小写字符
print yes 任意可打印字符
punct yes 任意标点字符
s no 任意空白字符
space yes 任意空白字符
unicode no 任意码点高于255的字符
u no 任意大写字符
upper yes 任意大写字符
w no 任意单词字符(字母、数字和下划线)。
word no 任意单词字符(字母、数字和下划线)。
xdigit yes 任意十六进制数字字符。

转载自:perl 正则表达式语法总结 | Technology Blog  如有冒犯请联系删除

Supongo que te gusta

Origin blog.csdn.net/xoofly/article/details/131436625
Recomendado
Clasificación