匹配两个字符串,其中一些文本是可选的匹配?

时间:2012-06-15 04:09:53

标签: regex string

我正在尝试编写一个简单的Java函数,它将获取语言输入列表,并查看我从数据库查询中获取的内容是否匹配。我的数据库中的所有字符串都已规范化,以便于搜索。这是一个例子。

研究实验室A希望参与者具有以下任何语言输入(它们由管道符|分隔):

{English | English, Spanish | Spanish} 

换句话说,本实验室可以选择单语英语,单语西班牙语或双语英语和西班牙语的参与者。这非常简单 - 如果数据库结果返回"English""English, Spanish""Spanish",我的函数将找到匹配项。

但是,我的数据库还会标记参与者是否只为某种语言输入了最少的语言(使用~字符)。

"English, ~Spanish" = participant hears English and a little Spanish
"English, ~Spanish, Russian" = participant hears English, Russian, and a little Spanish

这是我遇到麻烦的地方。我希望"English, ~Spanish""English""English, Spanish"匹配。

我在考虑删除/隐藏带有标记~的语言,但如果有一个研究实验室只需要{English, Spanish},那么"English, ~Spanish"将无法匹配,即使应该。

我也想不出如何使用正则表达式来完成这项任务。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

试试这个

\b(English[, ~]+Spanish|Spanish|English)\b

<强>代码

try {
    if (subjectString.matches("(?im)\\b(English[, ~]+Spanish|Spanish|English)\\b")) {
        // String matched entirely
    } else {
        // Match attempt failed
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}

<强>解释

"\\b" +               // Assert position at a word boundary
"(" +                // Match the regular expression below and capture its match into backreference number 1
                        // Match either the regular expression below (attempting the next alternative only if this one fails)
      "English" +          // Match the characters “English” literally
      "[, ~]" +            // Match a single character present in the list “, ~”
         "+" +                // Between one and unlimited times, as many times as possible, giving back as needed (greedy)
      "Spanish" +          // Match the characters “Spanish” literally
   "|" +                // Or match regular expression number 2 below (attempting the next alternative only if this one fails)
      "Spanish" +          // Match the characters “Spanish” literally
   "|" +                // Or match regular expression number 3 below (the entire group fails if this one fails to match)
      "English" +          // Match the characters “English” literally
")" +
"\\b"                 // Assert position at a word boundary

<强>更新

更通用的形式是这样的:

(?-i)\b([A-Z][a-z]+[, ~]+[a-z]+|[A-Z][a-z]+)\b
顺便说一句,这样做你可能会搞砸了,因为这种模式会与所有大写单词相匹配。在生成RegEx模式时,使用此语法可能有更好的选择。

(A[, ~]+B|A|B)

AB是语言的名称。我认为这将是一个更好的方法。