数字和逗号的正则表达式
Posted
技术标签:
【中文标题】数字和逗号的正则表达式【英文标题】:regexp for digits AND commas 【发布时间】:2018-03-23 22:22:26 【问题描述】:这应该比我想象的要容易得多,但是我已经尝试了三个小时,但什么也没有,所以这里...... 我有一个 varchar2(6) 列,所以它可以容纳任何东西。我正在尝试制作一个正则表达式来查找具有数字 和 逗号的值。任何地方。 我试过了:
'^\d1,5[,]\d1,5$'
'^\d+,+$'
'^[0-9]1,[,]1,$'
还有无数其他的组合,什么都没有。我也试过了
'^,$'
只是看看发生了什么,什么都没有。表格中有很多组合,例如
1,2,
1, 2
1 , 2
,1
我使用如下语法:
where regexp_like (REPLACE(column_name, ' ', ''), '^[0-9]1,[,]1,$')
去除空白并降低不同的值。
那么谁能指出我正确的方向,让正则表达式以任何顺序查找数字和至少一个逗号的值?
更新 - 也许这会澄清:我试图找到至少有一个数字和一个逗号的所有值。空白是无关紧要的,因为我把它拿出来了。除了数字和逗号之外没有其他字符。数字和逗号可以是任意顺序。
第二次更新 - 由于不熟悉正则表达式,我将 ^ 解释为表达式的开头,将 $ 解释为表达式的结尾。正如 ^ 和 $ 之间的所有内容一样,它是正则表达式。我刚刚看到 ^abc 表示匹配以 abc 开头的所有内容,而 abc$ 表示匹配以 abc 结尾的所有内容。
TIA
【问题讨论】:
1. - 为什么是正则表达式?也许这可以通过常规字符串函数来完成,可以吗? 2. 你能说出你想要解决的确切问题吗?例如:“我需要一个满足当且仅当值仅包含数字、逗号和/或空格的 WHERE 子句。”我读了你的帖子几次,我仍然不明白你需要什么。 例如:您说“至少一个逗号”。任何地方?您还需要“至少一位数字”吗?等等。 @mathguy - 第二句:“...一个正则表达式,用于查找具有数字和逗号的值。任何地方。”所以至少 1 个数字和 1 个逗号,最多 5 个 1 和 1 个另一个,以任意顺序排列。 【参考方案1】:我有一个 varchar2(6) 列,所以它可以容纳任何东西。我正在尝试制作一个正则表达式来查找具有数字和逗号的值。任何地方。
据此,我假设您要查找任何包含至少一个数字和至少一个逗号的字符串,顺序不限。
您可以使用\d.*,
查找数字后跟零个或多个任意字符,然后是逗号,使用,.*\d
查找逗号后跟零个或多个任意字符,然后是逗号。将这两者放在一起给出正则表达式:
\d.*,|,.*\d
或者,如果你想匹配整个字符串(但这不是必需的):
^.*\d.*,.*$|^.*,.*\d.*$
如果要查找仅包含至少一个数字、至少一个逗号和任意数量的空格的字符串,则可以将前面表达式中的每个 .
通配符匹配替换为 (\s|\d|,)
:
^(\s|\d|,)*\d(\s|\d|,)*,(\s|\d|,)*$|^(\s|\d|,)*,(\s|\d|,)*\d(\s|\d|,)*$
或者您可以否定表达式并测试没有任何不是,
或0-9
的字符:
SELECT *
FROM your_table
WHERE NOT REGEXP_LIKE( your_column, '[^,0-9]' );
【讨论】:
该列可以包含任何内容,我试图找到至少有一个数字和一个逗号但没有其他字符的列。我正在去除空白,所以这不是问题。所以它可能是 ,,,3 或 ,3, 或 123,3,. @BigFish 最终表达式应该适合您 - 如果您已经去除了空白,那么您可以从每个捕获组中删除前导\s|
。或者您可以寻找没有非逗号/数字字符(请参阅我的更新)。
这是我对正则表达式的问题之一——否定某些东西并寻找这个或那个真的很容易,但不仅仅是这个和那个......或者看起来......
@BigFish SQLFIDDLE 请提供一个复制问题的示例,因为我无法获得与您相同的结果。
对不起,伙计,我的错字...我复制了您的最后一个示例,并带有“不”,然后将其更改为尝试另一个示例,但忘记删除“不”。无论如何,你的倒数第二个(长的)看起来很有效。谢谢!【参考方案2】:
从你的例子中
1,2,
1, 2
1 , 2
,1
我推断(加上一点猜测):
至少一位数字,可选前缀和/或后缀空格,以及可选的逗号之前和/或后面。我猜 ,1 也可以,还有 ,123 或 123,但 12 3 可能不行。 ",," 也一样(无效)。
",?[ \t]*[0-9]+[ \t]*,?"
这将是一个数字,可能是几个数字。
"(,?[ \t]*[0-9]+[ \t]*,?)+"
那将是这种类型的倍数。
根据情况,可能需要或不需要表达式开始(行)和表达式结束(或行)的标记:
"^(,?[ \t]*[0-9]+[ \t]*,?)+$"
我不习惯 oracle 正则表达式。在 SQL 中。也许某些部分需要遮罩(例如,圆括号和/或加号)。空格由空格和制表符 (\t) 组成。如果你不需要标签,那就更简单了:
"^(,? *[0-9]+ *,?)+$"
如果一个逗号是强制性的,您可以决定第一个或最后一个,或者创建两个替代表达式,一个带有前导,一个带有尾随逗号:
"^(,+ *[0-9]+ *,?)+$" -- at least one comma before, violates ex. 1,2,3
"^(,? *[0-9]+ *,+)+$" -- at least a trailing comma, violates ex. 2,3,4
"^((,+ *[0-9]+ *,?)+|(,? *[0-9]+ *,+)+)+$"
抱歉 - 无法测试。
【讨论】:
Oracle 中的选项卡不是\t
;您需要将其硬编码为 chr(9) - 意思是,将几个字符串片段与硬编码表达式 CHR(9)
连接起来。【参考方案3】:
MT0 给了我一个有效的答案,但经过更多探索后,我发现这也可以解决问题:
select count(*) as counter, my_column
from my_table
where regexp_instr (my_column, ',') > 0
and regexp_like(replace(replace(my_column, ' ', ''), ',', ''), '[0-9])
group by my_column
order by counter desc;
显然,正如我在更新的问题中所说,我最大的问题是我误解了 ^ 和 $ 的用途。希望这对其他人有帮助。
感谢大家的帮助!
【讨论】:
【参考方案4】:REGEXP_LIKE(column_name,'^[0-9 ,]+$')
如果文本恰好包含一个或多个数字、空格或逗号,则匹配。
[0-9 ,]
表示“任何单个数字、空格或逗号”。在将+
转换为“一个或多个数字、空格或逗号”之后添加。而开头的^
和结尾的$
意味着它必须从头到尾匹配——在匹配之前或之后不能有任何其他内容。
【讨论】:
以上是关于数字和逗号的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章