【问题标题】:extract a set of a characters between some characters在某些字符之间提取一组字符
【发布时间】:2018-01-19 16:47:27
【问题描述】:

我有一个字符串email = John.Mcgee.r2d2@hitachi.com

如何使用 regex 编写 java 代码来只带 r2d2? 我用了这个,但是在eclipse上出错了

String email = John.Mcgee.r2d2@hitachi.com
Pattern pattern = Pattern.compile(".(.*)\@");
Matcher matcher = patter.matcher      
for (Strimatcher.find()){
   System.out.println(matcher.group(1));
} 

【问题讨论】:

  • Strimatcher.find 肯定不会编译,因为你的变量持有Matchermatcher

标签: java regex substring


【解决方案1】:

在可能的多个点序列中的最后一个点之后匹配,请求您捕获的序列不包含点:

(?<=[.])([^.]*)(?=@)
  • (?&lt;=[.]) 表示“前面有一个点”
  • (?=@) 表示“后跟@ 符号”

请注意,由于点. 是一个元字符,因此需要使用\(Java 字符串文字加倍)或用方括号对其进行转义。

Demo.

【讨论】:

    【解决方案2】:

    不确定您发布的代码是否正确。我会根据它应该是什么样子来重写它:

        String email = John.Mcgee.r2d2@hitachi.com
        Pattern pattern = Pattern.compile(".(.*)\@");
        Matcher matcher = pattern.matcher(email);
        int count = 0;
        while(matcher.find()) {
           count++;
           System.out.println(matcher.group(count));
       } 
    

    但我认为你只是想要这样的东西:

    String email = John.Mcgee.r2d2@hitachi.com
    Pattern pattern = Pattern.compile(".(.*)\@");
    Matcher matcher = pattern.matcher(email);
    if(matcher.find()){
           System.out.println(matcher.group(1));
    }
    

    【讨论】:

      【解决方案3】:

      不需要Pattern 你只需要replaceAll 与这个正则表达式.*\.([^\.]+)@.* 这意味着得到组([^\.]+)(匹配一个或多个字符,除了一个点)它在点\.@ 之间

      email = email.replaceAll(".*\\.([^\\.]+)@.*", "$1");
      

      输出

      r2d2
      

      regex demo


      如果你想使用 Pattern,那么你必须使用这个正则表达式 \\.([^\\.]+)@

      String email = "John.Mcgee.r2d2@hitachi.com";
      Pattern pattern = Pattern.compile("\\.([^\\.]+)@");
      Matcher matcher = pattern.matcher(email);
      if (matcher.find()) {
          System.out.println(matcher.group(1));// Output : r2d2
      }
      

      您可以使用拆分的另一种解决方案:

      String[] split = email.replaceAll("@.*", "").split("\\.");
      email = split[split.length - 1];// Output : r2d2
      

      注意:

      • java中的字符串应该在双引号"John.Mcgee.r2d2@hitachi.com"之间
      • 你不需要在Java中转义@,但你必须用双斜线\\.转义点
      • 没有像 for (Strimatcher.find()){ 这样的 for 循环语法,也许你的意思是 while

      【讨论】:

      • 谢谢伙计。很有帮助。我喜欢替换所有路线,但是如果我不知道特殊字符将是什么怎么办。其特殊字符 R2D2 特殊字符。在这种情况下,我如何获得 R2D2 ?非常感谢
      • @Diwas 你是什么意思,所有 3 个解决方案都返回 r2d2 或点和 @ 之间的任何字符,例如,如果你使用另一个字符串 firstname.lastname@gmail.come 所有三个解决方案都返回 lastname跨度>
      • 我需要从这样的字符串中获取 R2D2: string email = john.mcgee(special character)r2d2(special character)@hitachi.com 我如何获得 r2d2,我不知道特殊字符将是?谢谢
      • @Diwas ok 这两个特殊字符之间的预期字符是什么?只是字母和数字?
      • 是的,只是字母和数字。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 2018-08-21
      • 2015-09-14
      相关资源
      最近更新 更多