如何通过正则表达式获取最后一项?
"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之前有任何空格,我该如何改变?
进行测试答案 0 :(得分:3)
请注意111\s(.*)$
匹配字符串内的111
(第一次出现),然后捕获到子匹配1 任何 0+字符,直到字符串结尾。
如果在最后sam
之前有空格,您可以使用
^111.*\s(\S+)$
模式说明:
^
- 字符串开头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+)$
以非空格字符结尾。第一个捕获组。