【问题标题】:Beginner Regular Expressions Java初学者正则表达式 Java
【发布时间】:2014-01-10 21:50:15
【问题描述】:

我想编写一个正则表达式,以匹配名称的几种变体/常见用法之一。

我需要接受用户输入,然后验证输入是否与列出的变体之一匹配。如果匹配,我需要输出匹配,如果没有,我应该输出输入不匹配。

这是我目前所拥有的:

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegExMyName {

    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);

        System.out.println("Name: Daimon");
        System.out.println("Common Usages: Daimon, Daimo, Dai, daimon, daimo, DAIMON");
        System.out.println("Enter any of the variations listed only: ");

        //*** HELP REQUIRED WITH PATTERN BELOW - pat
        Pattern pat = Pattern.compile();
        Matcher match = pat.matcher(scan.nextLine());


        //***HELP REQUIRED WITH FIND BELOW
        if (match.find()){
            System.out.println("*** You entered a valid name ***");
        }else{
            System.out.println("*** You entered an invalid name ***");
        }




    }
}

我需要一些帮助来构建模式或接收有关可以完成相同任务的替代方法的建议。

谢谢。

【问题讨论】:

  • 为什么我的名字不能是“(╯°□°)╯”?您是想将其抽象为通用名称验证器还是仅验证一个特定名称的变体?
  • 阅读此tutorial。顺便说一句,只要字符串的任何部分与模式匹配,match.find() 就会找到匹配项。如果您想确保整个字符串与左侧或右侧没有多余的内容匹配,请使用match.matches()
  • 我会在这里使用Set 来检查允许列表中的输入
  • 感谢您的回复!我正在尝试验证一个名称,但如果可以提供有关最佳实践的信息,以便将其抽象为通用名称验证器,肯定会很有趣?
  • 哦,好吧,我不确定这一切是如何运作的。我会根据需要审查帖子和更新。感谢您提供信息。!

标签: java regex expression


【解决方案1】:

此模式将匹配任何字符串DaimonDaimoDaidaimondaimoDAIMON

Pattern pattern = Pattern.compile("^([dD]aimon?|DAIMON|Dai)$");

或者稍微大一点的模式看起来像这样

Pattern pattern = Pattern.compile("^dai(mon?)?$",Pattern.CASE_INSENSITIVE);

【讨论】:

  • 慷慨的模式也将匹配dAiMon等。(此评论旨在提供信息)
  • @nhahtdh 是的。这就是为什么a称它“更慷慨”。如果 OP 确实需要将输入限制为 列表中指定的那些字符串,则第一个模式就足够了。
  • 非常感谢!因此,如果我将模式设置为上述模式,我将如何将其与 if 语句一起使用,即我应该调用什么方法,以及应该传递什么参数 - match.find(ARGUMENT) 是正确的选项吗?
  • @user2904978 match.find() 本身应该没问题。
  • @user2904978 也可以看看这个优秀的regex explainer
【解决方案2】:

对于您描述的情况,我不会使用正则表达式,我宁愿存储名称的可能变体,例如在列表中将仅使用简单的包含来验证输入。

List<String> daimons = Arrays.asList("Daimon", "Daimo", "Dai", "daimon", "daimo", "DAIMON");

对于您的示例,我并没有真正看到正则表达式的强大功能。如果我看不到你的解决方案,我可能会是类似的:

公共类 RegExMyName {

public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);

    List<String> daimons = Arrays.asList("Daimon", "Daimo", "Dai", "daimon", "daimo", "DAIMON");
    StringBuilder diamonCommonUsage = new StringBuilder();
    for(String daimonVariations : daimons) {
      diamonCommonUsage.append(daimonVariations);
      diamonCommonUsage.append(", "); //+ remove the last ","
    }        

    System.out.println("Name: Daimon");
    System.out.println("Common Usages: " + diamonCommonUsage.toString());
    System.out.println("Enter any of the variations listed only: ");

    if (match.find(daimons.contains(scan.nextLine()))){
        System.out.println("*** You entered a valid name ***");
    }else{
        System.out.println("*** You entered an invalid name ***");
    }
}

}

【讨论】:

  • 感谢您的回复,但我必须使用 RegEx 进行测试。
  • 呵呵,它改变了一切!但是,是的,不客气。 :)
猜你喜欢
  • 2011-02-06
  • 2014-03-22
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 2020-07-13
  • 1970-01-01
相关资源
最近更新 更多