数字和逗号的正则表达式

时间:2018-03-23 22:22:26

标签: sql regex oracle

这应该比我想象的要容易得多,但我现在正在寻找一个尝试三个小时的事情,所以这里没有任何事情...... 我有一个varchar2(6)列,所以它可以容纳任何东西。我正在尝试使用正则表达式来查找具有数字逗号的值。无处不在。
我试过了:

'^\d{1,5}[,]\d{1,5}$'
'^\d+,+$'
'^[0-9]{1,}[,]{1,}$'

还有无数其他组合,没有。我也试过

'^,$'

只是为了看看发生了什么,什么都没有。表格中有很多组合,如

1,2,
1, 2
1 , 2
,1

我使用的语法如下:

where regexp_like (REPLACE(column_name, ' ', ''), '^[0-9]{1,}[,]{1,}$')

去除空白区域并降低不同的值。

那么有人能指出正确的方向让regexp以任何顺序查找数字和至少一个逗号的值吗?

更新 - 也许这会澄清:我试图找到至少有一个数字和一个逗号的所有值。白色空间无关紧要,因为我正在把它拿出来。没有其他字符而不是数字和逗号。数字和逗号可以按任何顺序排列。

第二次更新 - 由于对regexp的不熟悉,我将^解释为表达式的开头,将$解释为表达式的结尾。正如^和$之间的所有内容都是正则表达式。我刚刚看到^ abc意味着匹配从abc开始的所有内容,abc $表示匹配以abc结尾的所有内容。

TIA

4 个答案:

答案 0 :(得分:3)

  

我有一个varchar2(6)列,所以它可以容纳任何东西。我正在尝试使用regexp来查找具有数字和逗号的值。任何地方。

从那时起,我假设你想要找到任何一个至少有一个数字和至少一个逗号的字符串,无论是哪种顺序。

您可以使用\d.*,查找一个数字,后跟零或多个字符,然后用逗号和,.*\d查找逗号,后跟零或多个字符,然后a逗号。将这两者放在一起就会得到正则表达式:

\d.*,|,.*\d

或者,如果你想匹配整个字符串(但没有必要):

^.*\d.*,.*$|^.*,.*\d.*$

如果要查找仅包含至少一个数字,至少一个逗号和任意数量的空格的字符串,则可以将前一个表达式中的每个.通配符匹配替换为{{1 }}:

(\s|\d|,)

或者你可以否定表达并测试没有任何不是^(\s|\d|,)*\d(\s|\d|,)*,(\s|\d|,)*$|^(\s|\d|,)*,(\s|\d|,)*\d(\s|\d|,)*$ ,的字符:

0-9

答案 1 :(得分:0)

来自您的示例

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中。也许某些部件需要遮蔽(例如,圆形的parens和/或加号)。空格由空格和制表符(\ 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]+ *,+)+)+$"

抱歉 - 无法测试。

答案 2 :(得分:0)

MT0给了我一个有效的答案,但经过更多的讨论后,我发现这也可以解决问题:

    private static bool AreEnumerablesEqual<T>(IEnumerable<T> first, IEnumerable<T> second)
    {
        var firstList = first.ToList();
        var secondList = second.ToList();

        foreach (var item in firstList)
        {
            var itemIndex = firstList.IndexOf(item);
            if (!item.Equals(secondList[itemIndex]))
            {
                return false;
            }
        }
        return true;
    }

显然我最大的问题,就是我提出的更新问题,是我误解了^和$的用途。希望这有助于其他人。

感谢大家的帮助!

答案 3 :(得分:0)

REGEXP_LIKE(column_name,'^[0-9 ,]+$')

如果文本恰好包含一个或多个数字,空格或逗号,则此匹配。

[0-9 ,]表示“任何一位数字,空格或逗号”。将+转换为“一个或多个数字,空格或逗号”后,再添加。而^开头和$开头意味着它必须从头到尾都匹配-匹配之前或之后都不能有其他任何东西。