用于匹配后跟特定字符的组的正则表达式

时间:2019-06-02 11:56:33

标签: regex

所以我需要匹配以下内容:

1.2.
3.4.5.
5.6.7.10

((\d+)\.(\d+)\.((\d+)\.)*)在第一行就可以了,但是问题是:可能有很多行:可能是一个或多个。

\n仅在多于一行的情况下显示。

在字符串版本中,我是这样的:"1.2.\n3.4.5.\n1.2."

所以我的问题是:如果只有一行,\n不必在末尾,但是如果有多行,\n则需要在每一行的末尾除了最后一行。

4 个答案:

答案 0 :(得分:2)

这是我建议的模式:

^\d+(?:\.\d+)*\.?(?:\n\d+(?:\.\d+)*\.?)*$

Demo

以下是该模式的简要说明:

^                   from the start of the string
\d+                 match a number
(?:\.\d+)*          followed by dot, and another number, zero or more times
\.?                 followed by an optional trailing dot
(?:\n               followed by a newline
\d+(?:\.\d+)*\.?)*  and another path sequence, zero or more times
$                   end of the string

答案 1 :(得分:2)

您可以使用正向超前(?=.*\n)检查结尾处是否有换行符:

(?=.*\n)(\d+)\.(\d+)\.((\d+)\.)*

查看regex demo

修改

您可以使用alternation来匹配,如果在下一行跟随相同的模式,或者在不跟换行时匹配该模式。

^(?:\d+\.\d+\.(?:\d+\.)*(?=.*\n\d+\.\d+\.)|\d+\.\d+\.(?:\d+\.)*(?!.*\n))

Regex demo

  • ^字符串的开头
  • (?:非捕获组
    • \d+\.\d+\.匹配一个数字和一个点2次
    • (?:\d+\.)*重复0+次,匹配1+个数字和一个点
    • (?=.*\n\d+\.\d+\.)前瞻性,断言以模式开头的换行符之后的内容
    • |
    • \d+\.\d+\.匹配一个数字和一个点2次
    • (?:\d+\.)*重复0+次,匹配1+个数字和一个点
    • *(?!.*\n)负前行,断言其后不是换行符
  • )关闭非捕获组

答案 2 :(得分:0)

(\d+\.*)+\n*将与您提供的文本匹配。如果您需要确保最后一行也以.结尾,那么(\d+\.)+\n*将起作用。

答案 3 :(得分:0)

大多数编程语言都提供m标志。这是 multiline 修饰符。启用此功能将使$在行尾和字符串末尾匹配。

下面的解决方案仅将$附加到当前的正则表达式中,并设置m标志。视您的编程语言而定。

var text = "1.2.\n3.4.5.\n1.2.\n12.34.56.78.123.\nthis 1.2. shouldn't hit",
    regex = /((\d+)\.(\d+)\.((\d+)\.)*)$/gm,
    match;


while (match = regex.exec(text)) {
  console.log(match);
}

您可以将正则表达式简化为/(\d+\.){2,}$/gm,然后根据点字符拆分完全匹配项以获取所有不同的数字。我在下面提供了一个JavaScript示例,但是在大多数语言中,获取子字符串和拆分字符串是非常基本的操作。

var text = "1.2.\n3.4.5.\n1.2.\n12.34.56.78.123.\nthis 1.2. shouldn't hit",
    regex = /(\d+\.){2,}$/gm;

/* Slice is used to drop the dot at the end, otherwise resulting in
 * an empty string on split.
 *
 *     "1.2.3.".split(".")   //=> ["1", "2", "3", ""]
 *     "1.2.3.".slice(0, -1) //=> "1.2.3"
 *     "1.2.3".split(".")    //=> ["1", "2", "3"]
 */
console.log(
  text.match(regex)
      .map(match => match.slice(0, -1).split("."))
);

有关正则表达式标志/修饰符的更多信息,请查看:Regular Expression Reference: Mode Modifiers