正则表达式将所有内容返回到第n个字符后的第一个空格

时间:2017-09-29 22:21:55

标签: regex

我有一个产品名称列表,我想缩短它们(短名称)。我需要一个正则表达式,它将返回第一个单词,如果它超过5个字符和前两个单词,如果它是5个字符或更少。

Product Name            Short Name
BABY WIPES MIS /ALOE    BABY WIPES
PKU GEL PAK             PKU GEL
CA ASCORBATE TAB 500MG  CA ASCORBATE
SOD SUL/SULF CRE 10-2%  SOD SUL/SULF
ASPIRIN TAB 81MG EC     ASPIRIN
IRON TAB 325MG          IRON TAB
PEDA                    PEDA

我最初使用过:

^([^ \t]+).*

但它只返回第一个字,所以BABY WIPES MIS / ALOE将是BABY。然后我尝试了:

.....([^ \t]+)

但是这似乎不适用于少于5个字符的名称。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

然而,你的尝试很接近,因为你否定了空格和标签,你无法移动到第一个单词。

代码

See code in use here

^(\S{1,5}[ \t]*?\S+).*$

注意:该链接使用以下缩短的正则表达式。 \h可能无法正常使用正则表达式,这就是为什么上面的代码也会发布的原因。

^(\S{1,5}\h*?\S+).*$

超级简化它变为^\S{1,5}\h*?\S+(没有捕获组和.*$作为最初使用的OP。)

结果

输入

BABY WIPES MIS /ALOE
PKU GEL PAK
CA ASCORBATE TAB 500MG
SOD SUL/SULF CRE 10-2%
ASPIRIN TAB 81MG EC
IRON TAB
PEDA

输出

BABY WIPES
PKU GEL
CA ASCORBATE
SOD SUL/SULF
ASPIRIN
IRON TAB
PEDA

说明

  • ^在行首处断言位置
  • (\S{1,5}[ \t]*?\S+)捕获小组执行以下操作
    • \S{1,5}匹配1到5次之间的任何非空白字符
    • [ \t]*?多次匹配空格或制表符,但尽可能少(请注意,在PCRE正则表达式中,可以将其替换为\h*?以缩短它)
    • \S+在一次和无限次之间匹配任何非空白字符
  • .*匹配任何字符(假设s修饰符已关闭,换行符除外 - 应该是针对此问题)
  • $断言行尾的位置

答案 1 :(得分:0)

你可以使用这样的正则表达式:

^\S{1,5} \S+|^\S+
or
^\S{1,5} ?\S*

<强> Working demo

enter image description here

顺便说一句,如果你想用缩短的版本替换整行,那么你可以改用这个正则表达式:

(^\S{1,5} \S+|^\S+).*
or
(^\S{1,5} ?\S*).*

使用替换字符串$1\1取决于您的正则表达式引擎。

<强> Working demo