簡體   English   中英

正則表達式解析至少20個字符的文本,字符串中不帶空格

[英]Regex to parse at least 20 char text without spaces from string

我需要在SQL查詢中為Oracle DB解析手工輸入的字符串字段中的代碼,它看起來像這樣:

“我願意嗎?!想/做* bb a8 001 / XYZ / 0002/65432178非常感謝您的朋友”

每一行的單詞數完全不同,只有相同的是單詞之間的空格。 字符串中間的某個位置(但也可能是開頭或結尾)是我需要解析的長度可變的CODE(總是至少20個字符)-代碼始終沒有空格,並且與其余部分分開文字按空格。 我只需要解析掉所有單詞的代碼。 因此,在我看來,如何識別代碼的唯一方法是將代碼至少包含20個字符,且沒有空格。 您可以推薦regex做這種事情嗎? 非常感謝你

所以我希望得到像這樣的字符串“ 001 / XYZ / 0002/65432178”

您只需要查找20多個實例的序列即可,除了空格:

select regexp_substr(
  'i would ?! like / to make * bb a8 001/XYZ/0002/65432178 thank you very much friends',
  '[^ ]{20,}') as result
from dual;

RESULT               
---------------------
001/XYZ/0002/65432178

[^ ]是排除空格的模式; {20,}表示必須重復最少20次,最多沒有重復。

如果要排除任何空格(例如,在需要的部分之前或之后有一個制表符而不是空格),則可以使用字符類代替:

regexp_substr(<your string>, '[^[:space:]]{20,}')

正如@MTO所指出的那樣,它們將匹配值中的前20個字符的字符串,並且用戶輸入的文本可能包含您不希望看到的長非代碼值,這是可行的。 如果可以匹配代碼的預期模式,那就更好了。

如果您的單詞永遠不會超過20個字符,那么您可以天真地使用:

SELECT REGEXP_SUBSTR( value, '\S{20,}' ) AS code,
       value
FROM   data d;

但是,如果單詞長度超過20個字符,例如:

CREATE TABLE data ( value ) AS
SELECT 'long words like floxinoxinihilipilification and antidisestablishmentarianism with your code 001/XYZ/0002/65432178' FROM DUAL UNION ALL
SELECT 'i would ?! like / to make * bb a8 001/XYZ/0002/65432178 thank you very much friends' FROM DUAL;

然后上面的代碼輸出:

CODE                        | VALUE                                                                                                            
:-------------------------- | :----------------------------------------------------------------------------------------------------------------
floxinoxinihilipilification | long words like floxinoxinihilipilification and antidisestablishmentarianism with your code 001/XYZ/0002/65432178
001/XYZ/0002/65432178       | i would ?! like / to make * bb a8 001/XYZ/0002/65432178 thank you very much friends

相反,您可以嘗試執行類似的操作,例如返回包含20個以上字符的單詞,其中該字符也包含最多/字符:

SELECT ( SELECT MAX( REGEXP_SUBSTR( d.value, '\S{20,}', 1, LEVEL ) ) KEEP ( DENSE_RANK LAST ORDER BY REGEXP_COUNT( REGEXP_SUBSTR( d.value, '\S{20,}', 1, LEVEL ), '/' ) )
         FROM   DUAL
         CONNECT BY LEVEL <= REGEXP_COUNT( d.value, '\S{20}' )
       ) AS code,
       value
FROM   data d;

哪個輸出:

CODE                  | VALUE                                                                                                            
:-------------------- | :----------------------------------------------------------------------------------------------------------------
001/XYZ/0002/65432178 | long words like floxinoxinihilipilification and antidisestablishmentarianism with your code 001/XYZ/0002/65432178
001/XYZ/0002/65432178 | i would ?! like / to make * bb a8 001/XYZ/0002/65432178 thank you very much friends

db <> 在這里撥弄

暫無
暫無

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

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