简体   繁体   English

如何在Java中使用Regex进行模式匹配?

[英]How to use Regex in Java to pattern match?

I have read the documentation and various tutorials online but I'm still confused on how regex works in Java. 我已经在线阅读了文档和各种教程,但我仍然对正则表达式如何在Java中工作感到困惑。 What I am trying to do is create a function which takes in argument of type string. 我要做的是创建一个接受类型字符串参数的函数。 I then want to check if the passed string contains any characters other than MDCLXVIivxlcdm. 然后,我想检查传递的字符串是否包含除MDCLXVIivxlcdm之外的任何字符。 So for example, string "XMLVID" should return false and "ABXMLVA" should return true. 因此,例如,字符串“XMLVID​​”应返回false,“ABXMLVA”应返回true。

public boolean checkString(String arg)
{
     Pattern p = Pattern.complile("[a-zA-z]&&[^MDCLXVIivxlcdm]");
     Matcher m = p.matcher(arg);
     if(m.matches())
          return true;
     else
          return false;
 }

When I pass, "XMLIVD", "ABXMLVA", and "XMLABCIX", all return false. 当我通过时,“XMLIVD”,“ABXMLVA”和“XMLABCIX”都返回false。 What am I doing wrong? 我究竟做错了什么? Any help will be greatly appreciated. 任何帮助将不胜感激。

You will need to use Java's character class intersection operator inside a character class, otherwise it literally matches && . 您将需要在字符类中使用Java的字符类交集运算符,否则它实际上匹配&& Btw, your first character class from A to (lowercase) z also includes [\\]^_ , which you certainly do not want; 顺便说一句,你从A到(小写) z的第一个字符类还包括[\\]^_ ,你当然不想要; and you misspelled "Patter.complile". 你拼错了“Patter.complile”。

Also, matches() 另外, matches()

Attempts to match the entire region against the pattern. 尝试将整个区域与模式匹配。

So you either need to use find() instead or pad the expression with .* . 所以你需要使用find()代替或者用.*填充表达式。

public boolean checkString(String arg) {
    return Pattern.compile("[[a-zA-Z]&&[^MDCLXVIivxlcdm]]").matcher(arg).find();
}

you can use a function like this, with two arguments, viz., 你可以使用这样的函数,有两个参数,即,

  • origingalString the original string to check origingalString要检查的原始字符串
  • searchString the string to be searched searchString要搜索的字符串

the code exactly, 代码完全,

public boolean checkCompletelyExist(String origingalString,String searchString){ 
  boolean found = false; 
  String regex = ""; 
  try{ 
    for(int i = 0; i < searchString.length();i++){ 
      String temp = String.valueOf(searchString.charAt(i)); 
      regex = "[\\x20-\\x7E]*"+"["+temp.toLowerCase()+"|"+temp.toUpperCase()+"]+[\\x20-\\x7E]*"; 
      if(!origingalString.matches(regex)){ 
        found = true; 
        break; 
      } 
    } 
    System.out.println("other character present : "+found); 
  } catch (Exception e) { 
    e.printStackTrace(); 
  } 
  return found; 
}

eg: 例如:

checkCompletelyExist("MDCLXVIivxlcdm","XMLVID") output will be other character present : false checkCompletelyExist("MDCLXVIivxlcdm","XMLVID")输出将出现other character present : false

and

checkCompletelyExist("MDCLXVIivxlcdm","ABXMLVA") output will be other character present : true checkCompletelyExist("MDCLXVIivxlcdm","ABXMLVA")输出将出现other character present : true

Regular Expressions (RegEx / RegExp) Basically, a regular expression is a pattern describing a certain amount of text. 正则表达式 (RegEx / RegExp) 基本上,正则表达式是描述一定量文本的模式。

^abc$   start / end of the string
\b \B   word, not-word boundary
\w \d \s    word, digit, whitespace
\W \D \S    not word, digit, whitespace
\z  - End of entire string
(…) - Grouping (capture groups)
[abc]   any of a, b, or c
[^abc]  not a, b, or c
[a-g]   character between a & g
{ m,n } - quantifiers for “from m to n repetitions”
+ - quantifiers for 1 or more repetitions (i.e, {1,})
? - quantifiers for 0 or 1 repetitions (i.e, {0,1})

POSIX Bracket Expressions POSIX bracket expressions are a special kind of character classes. POSIX Bracket Expressions POSIX括号表达式是一种特殊的字符类。 POSIX bracket expressions match one character out of a set of characters, just like regular character classes. POSIX括号表达式匹配一组字符中的一个字符,就像常规字符类一样。 The POSIX character class names must be written all lowercase. POSIX字符类名称必须全部小写。 The POSIX standard defines 12 character classes. POSIX标准定义了12个字符类。 The table below lists all 12, plus the [:ascii:] and [:word:] classes that some regex flavors also support. 下表列出了所有12个,以及一些正则表达式也支持的[:ascii:][:word:]类。

在此输入图像描述

Pattern Matching with Regular Expressions: 正则表达式匹配的模式:

final Pattern mix_alphaNumaric_pattern = Pattern.compile("^[A-Za-z0-9]+$");
final Pattern alphabets_pattern = Pattern.compile("^[A-Za-z,\\- ]+$");
final Pattern alphabetsNull_pattern = Pattern.compile("|^[A-Za-z,\\- ]+$");
final Pattern numaric_pattern = Pattern.compile("^[0-9]+$");    // ^begning +followed By $end
final Pattern date_time_pattern = Pattern.compile("\\d{1,2}/\\d{1,2}/\\d{4}\\s\\d{1,2}\\:\\d{1,2}");
final Pattern weather_pattern = Pattern.compile("[\\-]*\\d{1,3}\\.\\d{1,6}");
final Pattern email_pattern = Pattern.compile("^[\\w-_\\.+]*[\\w-_\\.]\\@([\\w]+\\.)+[\\w]+[\\w]$");
final Pattern mobile_pattern = Pattern.compile("(\\+)?(\\d{1,2})?\\d{10}");

public static void main(String[] args) {
    String[] str = {"MCDL", "XMLIVD", "ABXMLVA", "XMLABCIX"}; 
    Pattern p = Pattern.compile("^(M|D|C|L|X|V|I|i|v|x|l|c|d|m)+$");
    // Returns: true if, and only if, the entire region sequence matches this matcher's pattern
    for (String sequence : str ) {
        boolean match = false, find = false;
        if ( !p.matcher(sequence).matches() ) match = true;
        if (p.matcher(sequence).find())       find = true;

        System.out.format("%s \t Match[%s] Find[%s]\n", sequence, match, find);
    }
}

OutPut: 输出:

MCDL     Match[false] Find[true]
XMLIVD   Match[false] Find[true]
ABXMLVA      Match[true] Find[false]
XMLABCIX     Match[true] Find[false]

@see this links to: @see链接到:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM