正则表达式获取空格后的最后一项

时间:2016-07-19 06:28:43

标签: regex go

如何通过正则表达式获取最后一项?

"Read the information failed.
111 a bcd

SAM Error Log not up supported"

我做了这个

111\s(.*)$

但它给了我

output = "a bcd sam"

但是,我想要以111开头的正则表达式输出

output = "sam" // for the line starts with 111

另外,如果111之前有任何空格,我该如何改变?

您可以在https://regex-golang.appspot.com/assets/html/index.html

进行测试

3 个答案:

答案 0 :(得分:3)

请注意111\s(.*)$匹配字符串内的111(第一次出现),然后捕获到子匹配1 任何 0+字符,直到字符串结尾。

如果在最后sam之前有空格,您可以使用

^111.*\s(\S+)$

enter image description here

模式说明

  • ^ - 字符串开头
  • 111 - 文字子串111
  • .* - 任何字符,0或更多,尽可能多的 last ...
  • \s - 空白
  • (\S+) - 子匹配1捕获一个或多个非空白字符
  • $ - 字符串结束。

如果您想获得以111开头的 (并且允许任何前导空格),并且在您的子匹配位置之后有一些空格,你可以考虑

(?m)^\s*111[^\r\n]*\s(\S+)$

.替换为[^\r\n],因为在Go正则表达式中,点.匹配任何字符 incl。换行符),或者 - 确保您只匹配水平空格:

(?m)^[^\S\r\n]*111[^\r\n]*[^\S\r\n](\S+)$

甚至

(?m)^[^\S\r\n]*111[^\r\n]*[^\S\r\n](\S+)$

<强>解释

  • (?m)^ - 该行的开头(由于(?m) MULTILINE修饰符,^现在匹配开始,$将匹配结束)
  • [^\S\r\n]* - 除LF和CR之外的零个或多个空格(= 水平空格
  • 111 - 文字111
  • [^\r\n]* - CR和LF以外的任何0个字符尽可能多到最后....
  • [^\S\r\n] - 水平空间
  • (\S+) - 子匹配1捕获1个非空白字符
  • $ - 行尾(前缀为[^\S\r\n]*[^\S\n]*以允许尾随水平空格)

这是Go demo

package main

import (
    "fmt"
    "regexp"
)

func main() {
    s := `Read SMART Log Directory failed.
    111 a bcd sam
       111 sam
     SMART Error Log not supported`
    rex := regexp.MustCompile(`(?m)^[^\S\r\n]*111[^\r\n]*[^\S\r\n](\S+)$`)
    fmt.Printf("%#v\n", rex.FindAllStringSubmatch(s,-1))
}

输出:[][]string{[]string{" 111 a bcd sam", "sam"}, []string{" 111 sam", "sam"}}

答案 1 :(得分:1)

这应该适合你:

\s(\w+)$ // The output will be `sam`

这意味着在空格之后捕获最后一个字符串($)。

答案 2 :(得分:1)

您可以使用:

^\s*1{3}.*\s(\S+)$

^行开头

\s*开头有0个或更多个空格

1{3}后跟三个(即111)

.*后跟任何内容

\s后跟空格

(\S+)$以非空格字符结尾。第一个捕获组。