我正在尝试编写一个简单的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"
将无法匹配,即使应该。
我也想不出如何使用正则表达式来完成这项任务。任何帮助将不胜感激!
答案 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)
A
,B
是语言的名称。我认为这将是一个更好的方法。