删除字符串中的一个单词(或两个空格之间)

Posted

技术标签:

【中文标题】删除字符串中的一个单词(或两个空格之间)【英文标题】:Removing one word in a string (or between two white spaces) 【发布时间】:2015-06-08 15:38:15 【问题描述】:

我有这个:

Dr. LeBron Jordan
John Bon Jovi

我想要这个:

Dr. Jordan
John Jovi

我是怎么做到的?我认为是 regexp_replace。

感谢收看。 非常感谢任何帮助。

【问题讨论】:

这是哪个数据库? Gary_W 和 Hemant Patel 都值得称赞。再次感谢。 【参考方案1】:

这是一种使用您提到的 regexp_replace 的方法,使用多种形式的名称进行测试。比嵌套的 SUBSTR()、INSTR() 更强大,但你需要了解正则表达式,一旦你学会了它,这将使你能够为更复杂的模式提供更多的模式匹配能力:

with tbl as (
  select 'Dr. LeBron Jordan' data from dual
  union
  select 'John Bon Jovi' data from dual
  union
  select 'Yogi Bear' data from dual
  union
  select 'Madonna' data from dual 
  union
  select 'Mr. Henry Cabot Henhouse' data from dual  ) 

select regexp_replace(data, '^([^ ]*) .* ([^ ]*)$', '\1 \2') corrected_string from tbl;

CORRECTED_STRING
----------------
Dr. Jordan
John Jovi
Madonna
Mr. Henhouse
Yogi Bear

正则表达式可以读作:

^      At the start of the string (anchor the pattern to the start)
(      Start remembered group 1
[^ ]*  Zero or more characters that are not a space
)      End remembered group 1
space  Where followed by a literal space
.      Followed by any character
*      Followed by any number of the previous any character
space  Followed by another literal space
(      Start remembered group 2
[^ ]*  Zero or more characters that are not a space
)      End remembered group 2
$      Where it occurs at the end of the line (anchored to the end)

那么 '\1 \2' 表示返回记住的组 1,后跟一个空格,然后是记住的组 2。

如果找不到模式,则返回原始字符串。这可以通过用方括号将返回的组括起来并再次运行来看到:

...
select regexp_replace(data, '^([^ ]*) .* ([^ ]*)$', '[\1] [\2]')
corrected_string from tbl;

CORRECTED_STRING
[Dr.] [Jordan]
[John] [Jovi]
Madonna
[Mr.] [Henhouse]
Yogi Bear

【讨论】:

Gary,感谢您提供正则表达式过滤器。我已经使用了一段时间,但不知道你不能对所有元素进行分组,例如你没有对可选中间名的 .* 占位符进行分组。我也刚刚学到了一些新东西。 很高兴它有帮助。诀窍是将字符串模式描述为正则表达式,并围绕您要使用的部分进行分组。【参考方案2】:

如果只有两个词,它会返回那个。 (“Lebron Jordan”将返回“Lebron Jordan”)

如果是三个单词,则取出中间的单词(“Dr. LeBron Jordan”会返回“Dr. Jordan”)

DECLARE @firstSpace int = 0
DECLARE @secondSpace int = 0
DECLARE @string nvarchar(50) = 'Dr. Lebron Jordan'

SELECT @string = LTRIM(RTRIM(@string))

SELECT @firstSpace = CHARINDEX(' ', @string, 0)
SELECT @secondSpace = CHARINDEX(' ', @string, @firstSpace + 1)

IF @secondSpace = 0
BEGIN
    SELECT @string
END
ELSE
BEGIN
    SELECT SUBSTRING(@string, 0, @firstSpace) + SUBSTRING(@string, @secondSpace, (LEN(@string) - @secondSpace) + 1)
END

【讨论】:

您使用的是什么 DBMS?我对 SQL Server 2012 做了这个 Oracle SQL。 (我正在使用 SQL Developer。) 也感谢您的尝试。【参考方案3】:

在 SQL Server 中尝试以下单个语句:

declare @fullname varchar(200)
select @fullname='John Bon Jovi'
select substring(@fullname,1,charindex(' ',@fullname,1)) +  substring(@fullname, charindex(' ',@fullname,charindex(' ',@fullname,1)+1)+1, len(@fullname) - charindex(' ',@fullname,charindex(' ',@fullname,1)))

在 Oracle 中尝试以下语句

select substr(name,1,INSTR(name,' ', 1, 1)) 
|| substr(name, INSTR(name,' ', 1, 2)+1,length(name) - INSTR(name,' ', 1, 2))from temp

我试过同样的例子,请参考小提琴链接:http://sqlfiddle.com/#!4/74986/31

【讨论】:

我收到 ORA-00904 错误:“SUBSTRING”:标识符无效,感谢您的尝试 请尝试编辑版本的 oracle 并参考 fidlle 链接以获取相同的示例:

以上是关于删除字符串中的一个单词(或两个空格之间)的主要内容,如果未能解决你的问题,请参考以下文章

编写程序,输入字符串(包含空格),统计其中单词的个数,单词之间以一个或多个空格分隔。

仅用连字符替换单词之间的空格并删除所有其他空格[重复]

需要正则表达式来匹配两个单词,因为它们之间可能有任意数量的空格或其他字符

c ++如何提取单词之间的空格(如果有的话)

删除PHP中两个单词之间的空格[重复]

删除字符串中的所有空格