我有一个产品名称列表,我想缩短它们(短名称)。我需要一个正则表达式,它将返回第一个单词,如果它超过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个字符的名称。任何帮助将不胜感激。
答案 0 :(得分:0)
然而,你的尝试很接近,因为你否定了空格和标签,你无法移动到第一个单词。
^(\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 强>
顺便说一句,如果你想用缩短的版本替换整行,那么你可以改用这个正则表达式:
(^\S{1,5} \S+|^\S+).*
or
(^\S{1,5} ?\S*).*
使用替换字符串$1
或\1
取决于您的正则表达式引擎。
<强> Working demo 强>