当前位置: 首页 > 知识库问答 >
问题:

如何在oracle中拆分包含空格和特殊字符的字符串?

韩阳成
2023-03-14

我想用空格和特殊字符(如果有的话)来分割字符串。例如:用于表示移动交换中心(信号强度)。

目前我正在使用正则表达式来拆分字符串,但我无法同时实现空格和特殊字符的拆分

insert into tmp(word)
    select     regexp_substr('For expressing mobile switching center 
    (signal strength).', '(.*?)([[:space:]]|$)', 1, level, null, 1 ) as token
    from       dual
    connect by level <= regexp_count('For expressing mobile switching center (signal strength).', '[[:space:]/:]+') + 1

CREATE TABLE TMP(WORD VARCHAR2(4000));

Current Output: For
expressing
mobile
switching
center
(signal
strength).

Expected Output: For
expressing
mobile
switching
center
(
signal
strength
)
.

更新代码:

insert into tmp(word)
select     regexp_substr('For expressing mobile switching center (signal strength).', '(.*?)([[:space:]()]|$)', 1, level, null, 1 ) as token
from       dual
connect by level <= regexp_count('For expressing mobile switching center (signal strength).', '(.*?)([[:space:]()]|$)')+ 1

Result:
For
expressing
mobile
switching
center
(null)
signal
strength
.
(null)
(null)

共有3个答案

敖和韵
2023-03-14

这将拆分为任何非字母或数字的字符:

WITH
    aset AS( SELECT 'abc def;ghi|hkl () 0W-' AS tobesplit FROM DUAL ),
    splitup ( VALUE, rest ) AS
        (SELECT SUBSTR( tobesplit
                      , 1
                      , REGEXP_INSTR( tobesplit || ' ',  '[^a-zA-Z0-9]' ) - 1 )
              , SUBSTR( tobesplit, REGEXP_INSTR( tobesplit || ' ',  '[^a-zA-Z0-9]' ) + 1 ) || ' '
           FROM aset
         UNION ALL
         SELECT SUBSTR( rest
                      , 1
                      , REGEXP_INSTR( rest,  '[^a-zA-Z0-9]' ) - 1 )
              , SUBSTR( rest, REGEXP_INSTR( rest || ' ',  '[^a-zA-Z0-9]' ) + 1 )
           FROM splitup
          WHERE rest IS NOT NULL)
SELECT value 
  FROM splitup where value is not null;
鲁烨熠
2023-03-14

我调整了您的正则表达式,以便它搜索 (a) 括号字符或 (b) 一系列不是空格或括号的字符。

select     regexp_substr('For expressing mobile switching center (signal strength).', '[()]|[^[:space:]()]+', 1, level, null) as token
from       dual
connect by level <= regexp_count('For expressing mobile switching center (signal strength).', '[()]|[^[:space:]()]+');
姜宏放
2023-03-14

这是DB2,但希望您可以将其翻译为:

with data (s) as (values
('For expressing mobile switching center (signal strength).')
),
     tally (n) as (
select row_number() over (order by 1)
from   (values (0),(0),(0),(0),(0),(0),(0),(0)) x (n)
cross  join (values (0),(0),(0),(0),(0),(0),(0),(0)) y (n)
)
select regexp_substr(s,'([A-Za-z]+|\(|\)|\.)', 1, n)
from   data
cross  join tally 
where  n <= regexp_count(s,'([A-Za-z]+|\(|\)|\.)')
 类似资料:
  • 现在假设用户enterd AAA-222 结果将是 ps.拆分的部分应该包括空格。

  • 我有一个输入字符串像: 拆分后,我应该得到: 输出 规则: 格式类似于 值可以有除空格以外的任何特殊字符。 值可以有空格,如果在引号例如。或 我写了正则表达式,但引号内的引号搞砸了: 此外,我还尝试在上解析字符或拆分,但我面临着歧义,因为它们也可能在引号内。

  • 问题内容: 因此,stdin将一串文本返回到列表中,并且多行文本都是列表元素。您如何将它们全部分割成一个单词? 想要的输出: 问题答案: 您可以使用简单的列表推导,例如: 这将产生:

  • 这个问题类似于我之前的问题拆分一个包含破折号和减号的字符串。但我问错了,然后它得到了稍微不同的语义,人们从这个角度回答(包括)。因此,与其修改这个问题,我认为最好是提出一个新问题。 我必须拆分一个包含连字符-减号和减号的字符串。我尝试根据Unicode字符(https://en.wikipedia.org/wiki/Hyphen#Unicode)进行拆分,但考虑到减号与连字符-减号相同。有什么方法

  • 问题内容: 我想用多个定界符分割一个字符串,但将定界符保留在结果列表中。我认为这是解析任何一种公式的初始步骤都是有用的,而且我怀疑有一个不错的Python解决方案。 有人在这里用Java问了类似的问题。 例如,典型的拆分如下所示: 但是我正在寻找一种添加加号(或保留它)的好方法: 最终,我想对每个运算符和括号进行此操作,因此,如果有一种方法 一劳永逸,那就更好了。 问题答案: 您可以使用Pytho

  • 问题内容: 我必须检测一个字符串是否包含任何特殊字符。我该如何检查?Swift支持正则表达式吗? 我尝试了上面的代码,但是只有当我输入第一个字符作为特殊字符时,它才匹配。 问题答案: 您的代码检查字符串中是否没有字符来自给定的集合。您要检查的是给定集合中是否 没有 任何 字符: __ 您还可以使用正则表达式实现此目的: 该模式匹配的字符 不在 AZ,az或0-9范围内。 Swift 2更新: Sw