如何在MySQL中使用REGEXP使用SUBSTRING


14

我有以下情况。我必须使用MySQL对描述中的正则表达式进行细分。描述:

Lorem D9801 ipsum dolor坐在amet

其中D9801是REGEXP。每个强文本描述都有不同的内容,但我的正则表达式应类似于:REGEXP'D [[:digit:]] {4}'

REGEXP的开头始终为“ D”,结尾始终为“ xxxx”-4位数字:Dxxxx

我知道REGEXP仅返回true / false值,但是如何进行查询以仅返回'D9801'值?

我尝试过这样的事情:

SELECT SUBSTRING (description, LOCATE(REGEXP 'D[[:digit:]]{4}', description), 5)
FROM (
   SELECT "Lorem D9801 ipsum dolor sit amet" AS description
) temp

我知道这是错误的,因此我尝试使用此方法:

SELECT 
    id, 
    SUM(description REGEXP 'D[[:digit:]]{4}') AS matches, 
    CASE
        WHEN (SUM(description REGEXP 'D[[:digit:]]{4}') > 0) THEN 
            SUBSTRING(description, LOCATE( /*POSITION_OF_REGEXP_IN_DESC*/ , description), 5)
        ELSE 'Brak schematu'
    END AS show_substr FROM ps_description GROUP BY id;

但是如何找到正则表达式的位置?

我听说过UDF,但是我不能使用它,而是使用OVH托管。



如果不使用UDF,则没有内置功能可以从REGEXP函数中检索匹配的模式,而其他匹配方法则依赖于知道您要匹配的完整字符串,在这种情况下,该字符串不起作用
有效负载

Answers:


3

这将需要使用LOCATEand SUBSTRING语法从字符串中获取信息。这里将说明您需要的基本定位语法。

LOCATE(搜索str,str,[位置])

search str =将要搜索的字符串。

str =将要搜索的字符串。

position(可选)=搜索将从的位置(在第二个参数内)开始。

虽然在这里说明您需要的子字符串函数

SUBSTRING(str,pos,len)

str =一个字符串。

pos =起始位置。

len =字符长度。

查看此内容的更简单方法是将子字符串视为以下SUBSTRING(str FROM pos FOR len)

我用来获取第二个单词的语法如下,我利用了要提取的第二个单词周围不断出现的空格。

declare @String varchar(50) ='Lorem D9801 ipsum dolor sit amet'

SUBSTRING
(
@String,
LOCATE(' ', @String),
LOCATE(' ', @String, (LOCATE(' ', @String) + 1)) - LOCATE(' ', @String)
)

1

不幸的是,取决于表达式是否存在,MySQL的正则表达式函数返回true,false或null。

实现所需行为的技巧是确定哪个子字符串以您关心的字符开头,具有正确的长度并后跟一个数字。一系列substring_index函数用于提取字符串...

set @string:='Lorem D9801 ipsum dolor sit amet';
select
case when @string like '% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',1),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',2),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',3),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',4),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',5),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
end as test_case;
+-----------+
| test_case |
+-----------+
| D9801     |
+-----------+
1 row in set (0.00 sec)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.