mySql使用正則表達式匹配字符串

1.運用場景

1.1 後臺的數據庫由於歷史原因音頻的的名字存儲添加了許多的標題,如:67.寶寶睡覺覺,13_神燈,4_13 The Flying Vet,02、兩隻老虎,25 de Diciembre,04 _ Peek_a_Boo等等。現在運營的需求批量的將名字前面的序號或者下劃線去掉,如:67.寶寶睡覺覺   改成 寶寶睡覺覺,13_神燈 改成  神燈......

2.問題分析

2.1 後臺數據幾萬條,運營一條一條改的話不現實,只能是我們程序猿弄咯。字符串、正則.....完美。趕緊百度一把:mysql 正則表達式。mysql使用正則表達式使用關鍵字:REGEXP  ,開頭用:^,結尾:$,區間用:[ ] ,長度用:{}.....花個幾分鐘把我要的正則安排一下:數字開頭,緊接着下劃線或者點或者頓號.......

2.2  幾個實際案例:

2.2.1 兩個數字開頭後面是一個點:SELECT  * from  tb_smusic WHERE  name REGEXP  "^[0-9]{1,3}[.]"

數字開頭,後面點

2.2.2 兩個數字開頭後,面空格,下劃線,空格:SELECT  * from  tb_smusic WHERE  name REGEXP  "^[0-9]{1,3}[ ][_][ ]"

數字開頭,空格,下劃線,空格

2.2.3 接下來就是把原來的名字換成去掉目標字符之後的名字了。這裏可能要用到存儲函數或者存儲過程,這一塊用之前有學過,但是一直沒用過。所以最後選擇java+jdbc來做。

3.解決方案

3.1 主要的邏輯就是按照前面的正則匹配的方式把目標字符找出來,然後按照按照正則的規則切割,再然後就是更新就好了。就是一個select和一個update。上代碼:

import com.booyue.spider.spider.mapper.baby_mvc.TbSmusicMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@RunWith(SpringRunner.class)
@SpringBootTest
public class BabyMvcTest {

    @Autowired
    private TbSmusicMapper tbSmusicMapper;
    @Autowired
    private JdbcTemplate jdbcTemplate;


    String pattern1 = "^[0-9]{1,5}[.]";
    String pattern2 = "^[0-9]{1,5}[、]";
    String pattern3 = "^[0-9]{1,3}[ ][_][ ]";
    String pattern4 = "^[0-9]{1,5}[ ]";
    String pattern5 = "^[0-9]{1,5}[_]";
    String pattern6 = "^[0-9]{1,5}";

   final String defaultPattern=pattern1;

    @Test
    public void getTbSmusicItem() {
       String selectSql=
               "select tb_smusic.id,tb_smusic.name \n" +
               "from \n" +
               "tb_smusic,tb_sspecial,tb_sspecial_music \n" +
               "WHERE\n" +
               " tb_sspecial.id=tb_sspecial_music.special_id \n" +
               "AND\n" +
               " tb_sspecial_music.music_id=tb_smusic.id\n" +
               "AND tb_sspecial.id IN  (\n" +
               "1010,1011,1012,1014,1019,1028,1037,1038,1043,1048,1049,1050,1060,\n" +
               "1061,1062,1064,1065,1066,1067,1101,1102,1103,1104,1105,1106,\n" +
               "1111,1112,1113,1114,1115,1116,1117,1118,1120,1121,1122,\n" +
               "1123,1124,1125,1126,1127,1128,1130,1151,1157,111174,1175,1176,\n" +
               "1181,1182,1183\n" +
               ")";

        String updateSql="update tb_smusic set name =? ,origin_name=? where id=?";
        SqlRowSet set = jdbcTemplate.queryForRowSet(selectSql);
        while (set.next()) {
            Integer id = set.getInt(1);
            String name = set.getString(2);
            Pattern pattern = Pattern.compile(defaultPattern);
            Matcher matcher = pattern.matcher(name);
            if(matcher.find())
            {
                System.out.println(id);
                System.out.println(name);
                int end = matcher.end();
                String[] ss = name.split(defaultPattern, end);
                for (String s:ss) {
                    jdbcTemplate.update(updateSql,s,name,id);
                }
            }
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章