簡體   English   中英

在 mysql 正則表達式中添加一個點

[英]Add a dot to a mysql regex

我有以下 mysql 正則表達式:

REGEXP '-v[0-9]{1,2}'

其中捕獲-v01-v1以及-v03-v97 ,我想添加一個點. 最后:
-v01. -v1. -v03. -v97. 這樣它只捕獲版本號后跟點。

我試過\. 但這似乎不起作用——盡管它應該起作用。

我錯過了什么?

WITH cte AS (
  SELECT '-v01' val UNION ALL
  SELECT '-v12' UNION ALL
  SELECT '-v97' UNION ALL
  SELECT '-x12' UNION ALL
  SELECT '-v01.' UNION ALL
  SELECT '-v12.' UNION ALL
  SELECT '-v97.'
)
SELECT val, val REGEXP '-v[0-9]{1,2}\\.?' FROM cte
val REGEXP '-v[0-9]{1,2}\.?'
-v01 1個
-v12 1個
-v97 1個
-x12 0
-v01。 1個
-v12。 1個
-v97。 1個

小提琴

你可以使用這個正則表達式來做到這一點:

REGEXP '-v[0-9]{1,2}\\.+?'

\\.+ will make sure at least one "." after 2 digits to be exist

這適用於 mysql 8。

在舊的 mysql 上你不能使用 +? 和 *? 它拋出repetition-operator operand invalid

 I think there are two solutions, maybe more

第一個是,

  Here is the code 
 "REGEXP_REPLACE(a,'(-v)([a-zA-Z0-9]+)','\1\2.')

 With backreferences \1\2 or $1$2 
  

第二個是,

SELECT obs, REGEXP_REPLACE (obs, '$', '.') AS RESULT
FROM (SELECT 'asda -v01' AS obs FROM DUAL
    UNION ALL
    SELECT 'aaaa -v12' AS obs FROM DUAL
    UNION ALL
    SELECT '123 -v97' AS obs FROM DUAL
    UNION ALL
    SELECT 'v42 -x12' AS obs FROM DUAL
    UNION ALL
    SELECT '-v01' AS obs FROM DUAL
    UNION ALL
    SELECT '-v12' AS obs FROM DUAL
    UNION ALL
    SELECT '-v97' AS obs FROM DUAL)

第一個代碼Regex101

第二個代碼Regex101

這是適用於所有 mysql 版本的有效解決方案。

REGEXP '-v[0-9]{1,2}\\.{1,}?'

\\.{1,} instead of \\.+ will work fine with no *repetition-operator operand invalid* error.
It will make sure at least one "." after 2 digits to be exist

似乎您正在使用舊版本的 mysql。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM