目标:
我有一个回答框,它将接受用户的输入。为了减少输入到后端的可能正确答案的数量,我想在答案的开头和结尾使用RegExp来忽略某些单词/字符。
因此,如果答案是:山。我也会接受:山或山或山.
我尝试过的:
bool checkAnswer(String answer) {
List _answers = widget.answers;
for (var i = 0; i < _answers.length; ++i) {
// This
_correctAnswer = RegExp("?!(the)|(an)|(a)?${widget.answers[i]}s?").hasMatch(answer);
if (_correctAnswer) {
return _correctAnswer;
}
}
return false;
}该函数查看用户输入,并将其与我在后端输入的答案进行比较。问题是它还接受单个字符t,h,e‘.等等。
发布于 2020-07-05 08:04:06
因此,您需要删除一个领先的"the "或"a ",以及一个尾随的复数"s"。
也许:
bool checkAnswer(String answer, List<String> validAnswers) {
for (var i = 0; i < validAnswers.length; i++) {
var re = RegExp("^(?:the | an? )?${validAnswers[i]}s?\$", caseSensitive: false);
if (re.hasMatch(answer)) return true;
}
return false;
}此检查字符串是有效答案之一,可选前缀为the、a或an,可选后缀为s。
前面的^和$ (因为它在一个非原始字符串文本中的\$)确保regexp匹配整个输入( ^匹配字符串的开头,$匹配字符串的末尾)。|要么匹配它之前的东西,要么匹配它后面的东西(“备选方案”)。
如果您想匹配更多不同的后缀,例如"es“或".",您也可以更改s?以接受这些后缀:
var re = RegExp("^(?:the | an? )?${validAnswers[i]}(?:e?s)?\\.?\$", caseSensitive: false);我猜你想要接受s或es,并且,独立于此,接受.。
您的原始RegExp无效。如果它运行的话,我无法预测它会做什么。(例如,RegExp不能以?开头)。我建议阅读RegExp教程。
发布于 2020-07-05 09:57:23
这就是我如何结束解决问题的方式:
在开始时忽略: the,an,a忽略结尾:s,es和.
bool checkAnswer(String answer) {
List _answers = widget.answers;
for (var i = 0; i < _answers.length; i++) {
var re = RegExp("^(?:the |an |a )?${_answers[i]}(?:s|es)?.?\$", caseSensitive: false);
if (re.hasMatch(answer)) return true;
}
return false;
}https://stackoverflow.com/questions/62738081
复制相似问题