SQL搜索字符串中的#字符问题

时间:2018-06-01 12:55:02

标签: php mysql regex

我在mySQL搜索查询中使用了一些Regexp,除非我在查询中有#字符,否则它似乎工作正常。

Regexp基于单词边界进行匹配,因为此查询搜索的字段是存储在SQL数据库中的完整简历/课程简历。

例如,这可以按预期工作并返回正确的结果数:

SELECT COUNT(*) n FROM candidate c WHERE (c.CV REGEXP '[[:<:]]java[[:>:]]');

然而,当它应该返回几百时,它不会返回0结果:

SELECT COUNT(*) n FROM candidate c WHERE (c.CV REGEXP '[[:<:]]c#[[:>:]]');

我现在明白这是因为我基于单词边界进行匹配而#不能是单词的结尾。有趣的是,&#34; C ++&#34;虽然工作得很好。

有没有办法修改这个REGEXP,所以它也适用于#34; c#&#34;?

之类的字符串

5 个答案:

答案 0 :(得分:3)

您也许可以使用类似这样的东西:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    dataBaseHandler=new DataBaseHandler(this);
    try
    {
        dataBaseHandler.createDataBase();
    }

    catch (IOException e) {
        e.printStackTrace();
    }

    listViewusers=findViewById(R.id.listView);
    List<String> list=dataBaseHandler.getAllUsers();
    if(list!=null) {
        arrayAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.activity_list_item, list);
        listViewusers.setAdapter(arrayAdapter);
    }`

在较新的MySQL版本(8.0.4+)中,该版本通过ICU而不是Henry Spencer的实现支持正则表达式,您可以使用SELECT 'c#' REGEXP '(^|[^a-zA-Z0-9_])c#($|[^a-zA-Z0-9_])' SELECT 'java' REGEXP '(^|[^a-zA-Z0-9_])java($|[^a-zA-Z0-9_])' ,它看起来更干净:

\w

答案 1 :(得分:2)

一个选项可以替代:

SELECT COUNT(*) n 
FROM (SELECT REPLACE(cv, '#','sharp') AS cv FROM candidate) c 
WHERE (c.CV REGEXP '[[:<:]]csharp[[:>:]]');

答案 2 :(得分:1)

我认为您可以使用此功能或多或少地实现您想要的东西:

SELECT COUNT(*) n FROM candidate c WHERE (c.CV REGEXP '[^[:alpha:]]java[^[:alpha:]]');

可以像这样在C#情况下工作

SELECT COUNT(*) n FROM candidate c WHERE (c.CV REGEXP '[^[:alpha:]]c#[^[:alpha:]]');

请注意,如果仅用c ++替换c#,就会遇到问题,因为此正则表达式无效:

SELECT COUNT(*) n FROM candidate c WHERE (c.CV REGEXP '[^[:alpha:]]c++[^[:alpha:]]');

SELECT COUNT(*) n FROM candidate c WHERE (c.CV REGEXP '[^[:alpha:]]c\\+\\+[^[:alpha:]]');

为我工作(使用mysql CLI)

如果您对这些单词作为文本的开头/结尾显示感到困惑,则可以使用类似的

SELECT COUNT(*) n FROM candidate c WHERE (c.CV REGEXP '[^[:alpha:]]c#[^[:alpha:]]|^c#|c#$');

这非常接近单词边界要求。

答案 3 :(得分:1)

我不知道你为什么不能使用这样的东西

[[:<:]]c#([^#a-zA-Z0-9_]|$)

因为[[:>:]]是单词边界的结尾,表示后面的单词不是前面的单词
但是#不是一个单词,您仍然不需要在前面加上一个单词,我认为前面也没有#。

答案 4 :(得分:0)

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; function mergeArray(arr, n) { return arr .reduce((all, el, i) => { const ind = Math.floor(i/n); all[ind] = [...all[ind] || [], el] return all; },[]) .map(a => a.join(',')) } console.log(mergeArray(arr, 3));可以用作正则表达式定界符。因此,您需要使用反斜杠将其转义:

#