RegEx跳过单词

时间:2016-10-24 05:26:31

标签: regex pcregrep

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

                       "CSC 101 Intro to Computing  A  R"

我想抓拍

                        "CSC 101 A"

也许与此类似的东西

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分: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'的{​​{1}} 请注意,此处使用的模式为^(\w{3}\s\d{3}).*?(\w)\s+\w$

答案 1 :(得分:0)

执行:

^(\S+)\s+(\S+).*(\S+)\s+\S+$
  • 3个被捕获的组捕获了3个所需的魔药

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

  • \s表示任何空格字符

Demo

正如您在示例中使用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

答案 2 :(得分:0)

你可以去:

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

并使用第1 + 2组,见working on 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
$