我在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;?
之类的字符串答案 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));
可以用作正则表达式定界符。因此,您需要使用反斜杠将其转义:
#