【问题标题】:Regex Multiple Strings With "or" Operator带有“或”运算符的正则表达式多个字符串
【发布时间】:2015-04-12 11:49:15
【问题描述】:

我需要建立一个能够识别以下 3 种情况的 java 正则表达式:

  1. 以下字符的任意组合/数量:“ACTGactg:”

  1. 任何单个问号“?”

  1. 任何字符串“NTC”

我将列出迄今为止我尝试过的内容以及出现的错误。

public static final VALID_STRING = "[ACTGactg:]*";
// Matches the first case but not the second or third
// as expected.

public static final VALID_STRING = "\\?|[ACTGactg:]*";
// Matches all 3 conditions when my understanding leads me to
// believe that it should not except the third case of "NTC"

public static final VALID_STRING = "?|[ACTGactg:]*";
// Yields PatternSyntaxException dangling metacharacter ?

我希望准确的是:

public static final VALID_STRING = "NTC|\\?|[ACTGacgt:]*";

但我想确保如果我去掉“NTC”,任何“NTC”字符串都会显示为无效。

这是我用来测试这些正则表达式的方法。

private static boolean isValid(String thisString){
    boolean valid = false;
    Pattern checkRegex = Pattern.compile(VALID_STRING);
    Matcher matchRegex = checkRegex.matcher(thisString);
    while (matchRegex.find()){
        if (matchRegex.group().length != 0){
            valid = true;
        }
    }
    return valid;
}

所以这是我的结束问题:

  1. “\\?”正则表达式可能充当接受“NTC”字符串的通配符?

  2. or 运算符是“|”吗这里合适吗?

  3. 在使用这些或运算符时是否需要使用括号?

以下是一些传入字符串的示例:

  • A:C
  • T:G
  • AA:CC
  • T:C:A:G
  • NTC
  • ?

谢谢

【问题讨论】:

  • 既然你有一个提议的解决方案,为什么不直接测试它,看看它是否有效,然后在有或没有括号的情况下尝试它?
  • 您使用哪个对象/方法来测试字符串?
  • @DNA 好点。我尝试了许多不同的组合,却忘记了所有单独的结果。我想我在问规则/约定是什么。
  • @RealSkeptic 给我一秒钟,我将包括我正在使用的方法。
  • 你能提供一些应该匹配和不应该匹配的字符串示例吗?正则表达式是否应该匹配整个字符串?喜欢NTCAtgc??..

标签: java regex


【解决方案1】:

是的,提供的正则表达式就可以了:

public static final VALID_STRING = "NTC|\\?|[ACTGacgt:]+";

...

boolean valid = str.matches(VALID_STRING);

如果您从正则表达式中删除 NTC|,则字符串 NTC 将变为无效。

您可以自己测试和试验here

【讨论】:

  • 或使用matches 代替findfind 查找任何子字符串,matches 不查找。
  • 你说得对,matches 不需要行开始和结束锚点,我相应地修改了答案。
  • 我想我想保留 find 因为它对我在程序中检查的其他正则表达式很有帮助,所以我会在使用锚定方法时保留 find。
【解决方案2】:

由于您使用的是Matcher.find() 方法,因此您正在字符串中的任何位置寻找您的模式。

这意味着字符串A:CT:GAA:CC 等完全匹配。但是NTC呢?

它匹配是因为find() 在任何地方寻找匹配。 TC 部分匹配,因此你得到true

如果您只想匹配整个字符串,请使用match() 方法,或使用^$

请注意,如果您将模式更改为 [ACTGactg:]+ 而不是 [ACTGactg:]*,则不必检查匹配是否超过 0。

【讨论】:

  • 感谢您的深入解释,这当然是有道理的。
猜你喜欢
  • 2014-03-17
  • 2015-07-31
  • 2015-01-11
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 2021-11-10
相关资源
最近更新 更多