Android使用正则表达式进行关键词匹配

前言

        日常开发中,我们可能会遇到进行关键词匹配的需求。举个例子,比如当我们使用科大讯飞的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;
        }
    }

}

运行结果如下:
在这里插入图片描述

好了,完结!小伙伴有问题,请留言,大家随时探讨。

猜你喜欢

转载自blog.csdn.net/zhangqunshuai/article/details/82825774
今日推荐