Java 正则表达式:在第一次出现之前替换所有内容

Java 正则表达式:在第一次出现之前替换所有内容,java,regex,Java,Regex,我使用以下正则表达式删除URL的dev.部分 String domain = "dev.mydomain.com"; System.out.println(domain.replaceAll(".*\\.(?=.*\\.)", "")); 输出:mydomain.com但当域处于dev.mydomain.com.pe或dev.mydomain.com.uk的脉络中时,这会给我带来问题,在这些情况下,我只得到.com.pe和.com.u

我使用以下正则表达式删除URL的
dev.
部分

String domain = "dev.mydomain.com";
System.out.println(domain.replaceAll(".*\\.(?=.*\\.)", ""));
输出:
mydomain.com
但当域处于
dev.mydomain.com.pe
dev.mydomain.com.uk
的脉络中时,这会给我带来问题,在这些情况下,我只得到
.com.pe
.com.uk
部分

我可以在正则表达式上使用一个修饰符来确保它只接受第一个
(包括点)之前的内容吗

期望输出:

dev.mydomain.com
->
mydomain.com

stage.mydomain.com.pe
->
mydomain.com.pe


test.mydomain.com.uk
->
mydomain.com.uk

以下正则表达式适用于您。它将查找第一部分(如果存在),捕获字符串的其余部分作为第二个匹配组,并用第二个匹配组替换字符串
*?
是一种非贪婪搜索,在看到第一个点字符之前将进行匹配

(.*?\)?(.*..*)

示例代码:

String domain = "dev.mydomain.com";
System.out.println(domain.replaceAll("(.*?\\.)?(.*\\..*)", "$2"));

domain = "stage.mydomain.com.pe";
System.out.println(domain.replaceAll("(.*?\\.)?(.*\\..*)", "$2"));

domain = "test.mydomain.com.uk";
System.out.println(domain.replaceAll("(.*?\\.)?(.*\\..*)", "$2"));

domain = "mydomain.com";
System.out.println(domain.replaceAll("(.*?\\.)?(.*\\..*)", "$2"));
mydomain.com
mydomain.com.pe
mydomain.com.uk
mydomain.com
输出:

String domain = "dev.mydomain.com";
System.out.println(domain.replaceAll("(.*?\\.)?(.*\\..*)", "$2"));

domain = "stage.mydomain.com.pe";
System.out.println(domain.replaceAll("(.*?\\.)?(.*\\..*)", "$2"));

domain = "test.mydomain.com.uk";
System.out.println(domain.replaceAll("(.*?\\.)?(.*\\..*)", "$2"));

domain = "mydomain.com";
System.out.println(domain.replaceAll("(.*?\\.)?(.*\\..*)", "$2"));
mydomain.com
mydomain.com.pe
mydomain.com.uk
mydomain.com
你可以用

^[^.]+\.(?=.*\.)
请参阅和:

详细信息

  • ^
    -字符串的开头
  • [^.]+
    -1个或多个字符(点除外)
  • \。
    -一个点
  • (?=.*\)
    -后跟尽可能多的0个或更多字符(换行字符除外),然后是一个
Java使用示例:

String result = domain.replaceFirst("^[^.]+\\.(?=.*\\.)", "");

^[^.]*\.
有效吗?i、 e.“在字符串的开头,不是
的任意数量的字符,以第一次出现的
结尾。”。这就消除了对前瞻的需要,这绝对有效!但是我注意到了一个边缘情况,在生产中,由于没有
dev.
,表达式中断时,旧表达式确实适用于普通的
mydomain.com
,在这种情况下,新表达式将返回
.com
。因此,也许
^[^.]*\.(?=.\.\.\.
?在这种情况下,您也可以使用
^[^.]*.(?=[^.]+\)
或具体说明匹配什么
(:dev | stage | test)\.
是否需要正则表达式?为什么不使用
domain.substring(domain.indexOf('.')+1)
?@VGR我们使用的是AEM,因此是Java。我确实将逻辑移到了clientlib,并最终使用了这个精确的解决方案。有趣的是,你可能会建议hahaThis可以工作,但它不能解决原始情况,在这种情况下,域是
mydomin.com.uk
,在这种情况下,它仍然会返回
.com.uk
仅限
mydomain
常量名称吗?或者它也可以改变?!在本例中,当您可以在正则表达式中使用它时,它是常量,比如
(.*?)?(mydomain\..*)
,对吗?