前言
日常开发中,我们可能会遇到进行关键词匹配的需求。举个例子,比如当我们使用科大讯飞的asr(语音识别)接口时候,会将用户说的话转成文本给予返回,然后通过tts(文本转语音)接口做出相应的回答。在拿到用户说的内容时,如果进行全匹配显然效率不高,而且如果文本很长的话,匹配速度也很慢,这个时候我们需要根据其中的关键词进行匹配。而匹配的使用的就是正则表达式。
用法
下面是我封装好的通过正则表达式来进行关键词匹配的方法。注释很清楚,大家可以直接拿来用。只是提醒大家注意一下几点:
1.参数中传入的关键词,最好不要包含""(空格)。当然如果的有的话,也没关系,可以通过replaceAll("").trim();等给过滤掉。
2.带过滤的文本中可以包含任意符号,中英文符号都可以。想要过滤什么字符,就在 regEx ="…"后面添加相应的字符即可。
3.如果想要直接过滤掉某个词汇,则将其用括号括起来即可。
/**
* 通过正则表达式进行关键词匹配
*
* @param text 待匹配的原始数据
* @param keyWord 关键词
* @return
*/
private boolean regExTest(String text, String keyWord) {
Log.i(TAG, "regExTest: originalText::" + text + " keyWord::" + keyWord);
Pattern p;
Matcher m;
//用于过滤掉相关字符或词汇(用括号括起来的)的正则表达式,
String regEx = "[`~!@#$%^&*()+=|{}:;\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?a-zA-Z 0-9,嗯恩哦啊请吧(一下)(好吗)(可以吗)]";
p = Pattern.compile(regEx);
m = p.matcher(text);
text = m.replaceAll("").trim();
Log.i(TAG, "regExTest: text::" + text);
String regEx1 = new StringBuilder().append(".{0,10}(").append(keyWord).append(").{0,10}").toString();//eg: ".{0,10}(景色|漂亮).{0,10}"(todo 适用于长度不超多20的文本)
p = Pattern.compile(regEx1);
m = p.matcher(text);
Log.i(TAG, "Pattern:text::" + text + " matcher:" + m.matches());
if (m.matches()) {
return true;
} else {
return false;
}
}
验证
布局文件就一个按钮,就不贴出来了。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
private Button mBtnRegular;
/**
* 用于进行匹配的测试数据
*/
private String[] randomTextArray = {
"你好,你叫什么名字?",
"今天天气怎么样啊?",
"这里的景色真漂亮啊!",
"你这个人怎么可以这样啊?",
"请你帮我拿个面包可以吗?"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mBtnRegular = findViewById(R.id.regular_btn);
mBtnRegular.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.regular_btn:
String text = null;
String keyWord = null;
int index = new Random().nextInt(randomTextArray.length);
if (index == 0) {
//text::你好,你叫什么名字? keyWord::名字
text = randomTextArray[0];
keyWord = "名字";
} else if (index == 1) {
//text::今天天气怎么样啊? keyWord::天气|怎么
text = randomTextArray[1];
keyWord = "天气|怎么";
} else if (index == 2) {
//text::这里的景色真漂亮啊! keyWord::景色|漂亮
text = randomTextArray[2];
keyWord = "景色|漂亮";
} else if (index == 3) {
//text::你这个人怎么可以这样啊? keyWord::怎么|这样
text = randomTextArray[3];
keyWord = "怎么|这样";
} else if (index == 4) {
//请你帮我拿个面包可以吗? keyWord::面包
text = randomTextArray[4];
keyWord = "面包";
}
if (!TextUtils.isEmpty(text) && !TextUtils.isEmpty(keyWord)) {
regExTest(text, keyWord);
}
break;
default:
break;
}
}
/**
* 通过正则表达式进行关键词匹配
*
* @param text 待匹配的原始数据
* @param keyWord 关键词
* @return
*/
private boolean regExTest(String text, String keyWord) {
Log.i(TAG, "regExTest: originalText::" + text + " keyWord::" + keyWord);
Pattern p;
Matcher m;
//用于过滤掉相关字符或词汇(用括号括起来的)的正则表达式,
String regEx = "[`~!@#$%^&*()+=|{}:;\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?a-zA-Z 0-9,嗯恩哦啊请吧(一下)(好吗)(可以吗)]";
p = Pattern.compile(regEx);
m = p.matcher(text);
text = m.replaceAll("").trim();
Log.i(TAG, "regExTest: text::" + text);
String regEx1 = new StringBuilder().append(".{0,10}(").append(keyWord).append(").{0,10}").toString();//eg: ".{0,10}(景色|漂亮).{0,10}"(todo 适用于长度不超多20的文本)
p = Pattern.compile(regEx1);
m = p.matcher(text);
Log.i(TAG, "Pattern:text::" + text + " matcher:" + m.matches());
if (m.matches()) {
return true;
} else {
return false;
}
}
}
运行结果如下:
好了,完结!小伙伴有问题,请留言,大家随时探讨。