0

我想使用正则表达式来提取字符串的前几个单词和倒数第二个字母。
例如,在字符串中

                       "CSC 101 Intro to Computing  A  R"

我想捕捉

                        "CSC 101 A"

也许与此类似

                 grep -o -P '\w{3}\s\d{3}*thenIdon'tKnow*\s\w\s'

任何帮助将不胜感激。

4

3 回答 3

1

你可以去:

^((?:\w+\W+){2}).*(\w+)\W+\w+$

并使用组 1 + 2,看到它在 regex101.com 上工作


分解,这说:

^                 # match the start of the line/string
(                 # capture group 1
    (?:\w+\W+){2} # repeated non-capturing group with words/non words
)
.*                # anything else afterwards
(\w+)\W+\w+       # backtracking to the second last word character
$
于 2016-10-24T08:00:31.540 回答
0

做:

^(\S+)\s+(\S+).*(\S+)\s+\S+$
  • 3 组捕获的组捕获 3 种所需的药水

  • \S表示任何非空白字符

  • \s表示任何空白字符

演示


正如您grep在示例中使用 PCRE 一样,我假设您可以访问 GNU 工具集。使用 GNU sed

% sed -E 's/^(\S+)\s+(\S+).*(\S+)\s+\S+$/\1 \2 \3/' <<<"CSC 101 Intro to Computing  A  R"
CSC 101 A
于 2016-10-24T05:45:10.667 回答
0

整个 RegEx 模式无法匹配脱节的组。

我建议看一下捕获组 - 基本上你捕获两个不相交的组,然后可以通过引用这两个组来使用匹配的词对。

grep无法打印出多个捕获组,因此打印出的示例是sed请 注意,此处使用的模式是
echo 'CSC 101 Intro to Computing A R' | sed -n 's/^\(\w\{3\}\s[[:digit:]]\{3\}\).*\?\(\w\)\s\+\w$/\1 \2/p'CSC 101 A
^(\w{3}\s\d{3}).*?(\w)\s+\w$

于 2016-10-24T05:41:07.733 回答