RegEx:包含尾随和前导空格的所有行

时间:2018-03-21 12:01:46

标签: regex oracle

对不起,但这很可能只是另一个“我的regEx中的错误在哪里?” - 问题,在我尝试确定地址表中所有行的“添加到门牌号码”的格式“不对。

我想找到所有行,其中的值违反了给定的要求:

  • 不以(白色)空格开始或结束
  • 在第一个和最后一个字符之间可以包含任何字母,包括常规空格
  • 的长度至少为1,最多为20个字符
  • 不是NULL

示例:在结果中应该有行,其中cols值

  • 包含带有前导或尾随空格的字符串,如“auch”或“auch”
  • 超过20个字符

有效结果是-1AHaus 1(Gebäude 1)等字符串。

为此我做了fowolling查询:

SELECT *
from table
WHERE col is not null
AND NOT REGEXP_LIKE (col, 'my_reg_ex_see_below');

我尝试了以下正则表达式^([\S])([.]{0,18}[\S]{1}})+$,它应该确保:

  • 第一个字符必须是presend,且不能是空格
  • 第2到第19个字符是可选的,可以是任何类型
  • 如果至少有2个字符,则最后一个字符不能为空格

但是在我的结果中,所有行都返回,这不是NULL。

然后我尝试了这个正则表达式^([-0-9a-zA-Z])([-0-9a-zA-Z()\s]{0,18})([-0-9a-zA-Z\(\)]{0,1})$(我知道它太强了,因为它只允许asci字母)但即便如此,我仍然会得到错误的结果。我在结果中得到以下三行

  • 错误的结果:(Gebäude A)Haus 1
  • 正确的结果:auch(因为有一个尾随空格,结果正确)

那么如何修复我的正则表达式只能获得col不能满足上述要求的正确行。注意:也必须接受德语字母和paranthes之类的东西。

2 个答案:

答案 0 :(得分:3)

请注意,将速记字符类放入括号表达式时,会将其解析为字母和反斜杠模式。 [\S]匹配S\个字符。 [.]始终匹配一个点(即它与\.相同)。只在需要指定特定字符类时使用括号表达式(然后在其中使用POSIX字符类,例如[:space:]用于空格)。

您可以使用

^\S(.{0,18}\S)?$

请参阅regex demo

<强>详情

  • ^ - 字符串开头
  • \S - 非空白
  • (.{0,18}\S)? - 可选序列
    • .{0,18} - 任意0到18个字符
    • \S - 非空白字符
  • $ - 字符串结束。

答案 1 :(得分:3)

[\S]匹配\字符或S字符。

SQL Fiddle

查询1

WITH data( str, name ) AS (
  SELECT ' ', 'space' FROM DUAL UNION ALL
  SELECT '\', 'slash' FROM DUAL UNION ALL
  SELECT 's', 's' FROM DUAL UNION ALL
  SELECT 'S', 'S' FROM DUAL UNION ALL
  SELECT 'n', 'n' FROM DUAL UNION ALL
  SELECT CHR(13), 'CR' FROM DUAL UNION ALL
  SELECT CHR(10), 'LF' FROM DUAL
)
SELECT *
FROM   data
WHERE  REGEXP_LIKE( str, '[\S\n]' )

<强> Results

| STR |  NAME |
|-----|-------|
|   \ | slash |
|   S |     S |
|   n |     n |

因此,在上面的示例中,[\S\n]与非空白字符或回车字符不匹配,而是匹配\Sn个字符

你只需要:

SELECT *
from   table
WHERE  REGEXP_LIKE (col, '^\S(.{0,18}\S)?$');

正则表达式^\S(.{0,18}\S)?$将匹配:

  • ^字符串的开头
  • \S非空白字符
    规则 - 不以空格开头
  • ( )?一个可以匹配零次或一次的捕获组,其中包含:
    • .{0,18} 0到18个其他字符之间(规则 - 可以在第一个和最后一个字符之间包含任何字母,包括常规空格
      规则 - 长度最多为20个字符
    • \S非空白字符
      规则 - 不以空白结尾)
  • $字符串的结尾。