首页 > 解决方案 > 正则表达式匹配除

问题描述



So I have these values:
1.232.123.3.123.214.124.1241245124.123124124.124124.124124.123123123
1.232.123.3.123.214.124.1241245124.123124124.124124.124124.123123123.123.1234.12
1.232.123.3.123.214.124.1241245124.12345555.232

The idea is that all of them have a不同的长度。所以我需要匹配前5个元素之后的所有内容(我的意思是用“。”分割后产生的值)
所以我需要保留粗体文本
1.232.123.3.123。214.124.1241245124.123124124.124124.124124.123123123
1.232.123.3.123。214.124.1241245124.123124124.124124.124124.123123123.123.1234.12
1.232.123.3.123。214.124.1241245124.12345555.232

基于此,我尝试了以下
([0-9]*[.]){8}操作:返回根(我需要删除的值)
我尝试以某种方式匹配它的其余部分,但似乎没有任何效果这个匹配最后的 n 个元素,但是这个数字是可变的,它没有太大帮助:(([.][0-9]*){3})$



我需要这样的东西: 为此我使用过,但由于末端的长度是可变的,所以我不能使用它在此处输入图像描述
(([.][0-9]*){7})$

有任何想法吗?

标签: regex

解决方案


使用此模式([0-9]*[.]){8}可以为您提供部分匹配,因为它是未锚定的,它也可以匹配 8 个点,例如........数字是可选的。

此模式(([.][0-9]*){3})$匹配 3 个点,后跟可选数字,直到字符串的末尾。


您可以使用捕获组,并在匹配数字之前或之后重复点以不匹配连续点..

^(?:\d+\.){5}(\d+(?:\.\d+)*)$
  • ^字符串的开始
  • (?:\d+\.){5}重复 5 次匹配 1+ 数字后跟一个点
  • (捕获组 1
    • \d+(?:\.\d+)*匹配 1+ 位数字,并可选择重复匹配.和 1+ 位数字
  • )关闭组 1
  • $字符串结束

正则表达式演示

使用 Javascript 的示例

const regex = /^(?:\d+\.){5}(\d+(?:\.\d+)*)$/;
[
  "1.232.123.3.123.214.124.1241245124.123124124.124124.124124.123123123",
  "1.232.123.3.123.214.124.1241245124.123124124.124124.124124.123123123.123.1234.12",
  "1.232.123.3.123.214.124.1241245124.12345555.232",
  "1.232.123.3.123",
  "1.232.123.3.123.",
  "1.232.123.3.123.1",
  "........"
].forEach(s => {
  const match = s.match(regex);
  if (match) {
    console.log(match[1]);
  }
});


在 Java 中使用有限长度,您也可以只使用匹配,从字符串的开头向左断言 5 次重复。

(?<=^\d{1,10}\.\d{1,10}\.\d{1,10}\.\d{1,10}\.\d{1,10}\.)\d+(?:\.\d+)*$

正则表达式演示| Java 演示


推荐阅读