所以我需要匹配以下内容:
1.2.
3.4.5.
5.6.7.10
((\d+)\.(\d+)\.((\d+)\.)*)
在第一行就可以了,但是问题是:可能有很多行:可能是一个或多个。
\n
仅在多于一行的情况下显示。
在字符串版本中,我是这样的:"1.2.\n3.4.5.\n1.2."
所以我的问题是:如果只有一行,\n
不必在末尾,但是如果有多行,\n
则需要在每一行的末尾除了最后一行。
答案 0 :(得分:2)
这是我建议的模式:
^\d+(?:\.\d+)*\.?(?:\n\d+(?:\.\d+)*\.?)*$
以下是该模式的简要说明:
^ 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+)\.)*
修改
您可以使用alternation来匹配,如果在下一行跟随相同的模式,或者在不跟换行时匹配该模式。
^(?:\d+\.\d+\.(?:\d+\.)*(?=.*\n\d+\.\d+\.)|\d+\.\d+\.(?:\d+\.)*(?!.*\n))
^
字符串的开头(?:
非捕获组
\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