Regex 正则表达式无法将数字和破折号与字母(或空格和字母)匹配

Regex 正则表达式无法将数字和破折号与字母(或空格和字母)匹配,regex,postgresql,Regex,Postgresql,在这部作品中。。。但不是在PostgreSQL中 我的数据是这样的——通常是一系列的字母,后跟2个数字和一个可能的“-”或“空格”,后面只有一个字母。我试图用我的正则表达式分离出2个数字和可能的“-或“空格”以及一个字母: 例如: AJ 50-R Busboys ## should return 50-R APPLES 30 F ## should return 30 F FOOBAR 30 Apple ## should return 30 Regex已经在tester中运行,但在我尝试过

在这部作品中。。。但不是在PostgreSQL中

我的数据是这样的——通常是一系列的字母,后跟2个数字和一个可能的“-”或“空格”,后面只有一个字母。我试图用我的正则表达式分离出2个数字和可能的“-或“空格”以及一个字母:

例如:

AJ 50-R Busboys ## should return 50-R
APPLES 30 F ## should return 30 F 
FOOBAR 30 Apple ## should return 30
Regex已经在tester中运行,但在我尝试过的PostgreSQL中没有:

substring(REF from '([0-9]+)-?([:space:])?([A-Za-z])?') 
&

到目前为止,所有的测试都是在测试仪中进行的…但不是PostgreSQL。我只是不断得到返回的数字——之后什么也没有

我现在得到的ex:

AJ 50-R Busboys ## returns as "50" NOT as "50-R"

这是因为括号

我查阅了文档中的所有地方,发现了一个有趣的句子:

[…]如果模式包含任何括号,则返回与第一个括号子表达式匹配的文本部分,即左括号位于第一位的文本部分

我接受了你的第一个表情:

[0-9]+-?[:空格:?[A-Za-z]? 并用括号括起来:

[0-9]+-?[:空格:?[A-Za-z]? 而且效果很好,你看

更新: 另外,因为您正在寻找-或空间,您可以将中间表达式重写为[-|\s]?感谢您指出这一点,这将导致以下可能的正则表达式:

[0-9]+[-|\s]?[A-Za-z]?

更新2:

虽然我的回答解释了为什么结果与您的表达式部分匹配,但我上面给出的表达式没有通过您的第三个测试用例

您应该使用Matthew在中提供的正则表达式。

查找“[0-9]+-|[A-Za-z]\y?”中的:substringREF


在。您的主要问题是,子字符串返回第一个或最外面的匹配组,即,被包围的模式,这就是为什么您的“50-R”得到50。如果你在整个图案周围涂上一层,这会给你“50-R”。但是,即使考虑到这个问题,您的模式也无法在其他字符串上返回您想要的内容,因此我不得不修改整个正则表达式。

这与您的描述和示例相匹配。 你的描述有点模棱两可。在示例中,前导字母后面跟一个空格,然后是两位数字,这与您的描述相反

选择t,子字符串t'^[:alpha:]+\d\d:?[\s-]?[:alpha:]\M?“ 从…起 价值观 “AJ 50-R巴士男孩”-应返回:50-R ,“苹果30华氏度”-应返回:30华氏度 “FOOBAR 30苹果”-应返回:30 ,“FOOBAR 30x Apple”-应返回:30x ,'sadfgag30 D 66 X foo'-应返回:30 D-非:66 X rt; 解释 ^。。如果不锚定到起始和全局标志“g”,字符串最后一行的起始可能会失败。还有:更快。 [:alpha:][]+。。一个或多个字母或空格,如示例中所示。 .. 捕捉括号 \d\d。。两位数 :? .. 非捕获括号 [\s-]?…'-'或“空白”字符类,0或1次 [:alpha:][]。。一封信 \M。。跟在单词末尾的也可以是字符串的结尾 ? .. 非捕获括号中的模式为0或1次

根据当前区域设置由定义的字母!穷人的替代品[a-zA-Z]只适用于基本的ASCII字母,不能用于其他任何字符。考虑一下这个简单的演示:

选择子字符串'oö','[:alpha:]*' ,子串'oö','a-zA-Z]*';
这在第二个和第三个字符串上失败。@MatthewPlourde+1顺便说一句:@MatthewPlourde Right!现在我注意到了最后一个要求。我就这样说吧,因为你的答案提供了正确的正则表达式。@w0lf&Matthew:谢谢,+1的输入。前瞻和*here:[A-Za-z]?=$*的组合让我有点困惑。它与[A-Za-z]\y这样的东西有显著区别吗?没有,我已经更新了我的答案,使用了这个简单的语法。谢谢。@Matthew-你今天肯定给了我一些要学习的东西“\y”…你的答案与我要找的差不多。我必须做一些编辑,因为即使没有下面的字母或数字,我仍然需要返回一个数字-因此US 6仍然需要得到6。谢谢其实\在这种特殊情况下,y也起作用。[link]我使用了:“[0-9]+[-\s]?[A-Za-z]\y?”@Erwin-你搞定了。对于您添加的案例,正如您所注意到的,我没有打开全局标志,因此66 X不是一个问题,但是您提出了一个很好的观点,[:alpha:][]是>>然后[a-zA-Z]。我正在使用的数据集仅为ASCII-但我一直在各种正则表达式问题中享受utf-8字符的乐趣…在python和postgresql中遇到了一些中文数字问题,即它们没有被识别为数字-但正如您所指出的,在postgresql中更改本地字符是关键。谢谢@用户14696:很好。我澄清了你提到的部分。
AJ 50-R Busboys ## returns as "50" NOT as "50-R"