给定字符串:
Pattern pattern = Pattern.compile("\\b\\w+\\s\\b");
模式:
STACK
2013
输出结果为:
"\\b\\w+\\s\\b"
为什么呢?我读过,一旦在比赛中使用了一个角色,就无法在下一场比赛中再次使用。
但是我们首先匹配public static void main(String[] args) {
String str = "STACK 2013 OVERFLOW3";
Pattern pattern = Pattern.compile("\\b\\w+\\s\\b");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
:
\ b 用于边界(单词STACK之前)
\ w + 用于堆叠字
\ s 用于STACK后的空格
用于边界的\ b (在2013年之前)
这正如预期的那样,在匹配" STACK"。
中产生然后我们第二场比赛为" \ b \ w + \ s \ b":
用于边界的\ b (在2013年之前)< --- 此处第二次使用此边界
\ w + 用于2013字词
\ s 用于2013年后的空间
\ b 用于边界(在单词OVERFLOW3之前)
为什么单词之前的单词边界" 2013"在这些匹配中使用了两次?
重现的完整代码:
dat <- read.table(text = ' animal_id condition week_number label variable value
1 12 adlib 1 <NA> pc.value -0.110826762
2 13 adlib 1 <NA> pc.value -0.037862740
3 14 adlib 1 <NA> pc.value -0.252474983
4 15 pair 1 <NA> pc.value 0.097274297
5 16 pair 1 <NA> pc.value -0.015273153
6 17 adlib 1 <NA> pc.value -0.069534177
7 18 pair 1 <NA> pc.value -0.033537590
8 1 con 1 <NA> pc.value 0.167484278
9 2 con 1 <NA> pc.value 0.183647180
10 19 con 1 <NA> pc.value 0.229669153
11 20 con 1 <NA> pc.value 0.229764374
12 3 con 1 3 pc.value 0.357263429
13 21 con 1 <NA> pc.value 0.220650230
14 22 con 1 22 pc.value 0.126420908
15 23 con 1 <NA> pc.value 0.297326296
16 24 con 1 <NA> pc.value 0.227480415
17 25 pair 1 <NA> pc.value -0.379717347
18 26 pair 1 <NA> pc.value -0.262408892
19 27 pair 1 <NA> pc.value -0.044676089
20 28 pair 1 <NA> pc.value -0.270336604
21 29 adlib 1 <NA> pc.value -0.220693336
22 30 adlib 1 <NA> pc.value -0.206574036
23 4 con 1 <NA> pc.value 0.264751685
24 32 adlib 1 <NA> pc.value -0.005645539
25 33 adlib 1 <NA> pc.value -0.374329026
26 34 pair 1 <NA> pc.value -0.201130564
27 36 adlib 1 <NA> pc.value -0.227777601
28 5 con 1 <NA> pc.value 0.233753789
29 6 con 1 <NA> pc.value 0.247092487
30 7 pair 1 <NA> pc.value -0.237548606
31 8 adlib 1 <NA> pc.value -0.158702696
32 9 adlib 1 <NA> pc.value -0.049164200
33 1 con 2 <NA> pc.value -0.248305928
34 2 con 2 <NA> pc.value -0.313808423
35 3 con 2 <NA> pc.value -0.240626126
36 4 con 2 <NA> pc.value -0.235823821
37 5 con 2 <NA> pc.value -0.360493457
38 6 con 2 <NA> pc.value -0.137924685
39 7 pair 2 <NA> pc.value 0.133718228
40 8 adlib 2 <NA> pc.value 0.061174814
41 9 adlib 2 <NA> pc.value 0.246007965
42 10 pair 2 <NA> pc.value 0.255396196
43 11 pair 2 11 pc.value -0.138252815
44 12 adlib 2 <NA> pc.value 0.105495107
45 13 adlib 2 <NA> pc.value 0.192678628
46 14 adlib 2 <NA> pc.value -0.051937483
47 15 pair 2 <NA> pc.value 0.102928123
48 16 pair 2 <NA> pc.value 0.164727853
49 17 adlib 2 <NA> pc.value -0.052299544
50 18 pair 2 <NA> pc.value 0.267744360
51 19 con 2 <NA> pc.value -0.213689714
52 20 con 2 <NA> pc.value -0.308084378
53 21 con 2 <NA> pc.value -0.292024696
54 22 con 2 <NA> pc.value -0.100708378
55 23 con 2 <NA> pc.value -0.374211596
56 24 con 2 <NA> pc.value -0.375983300
57 25 pair 2 <NA> pc.value 0.210358577
58 26 pair 2 <NA> pc.value 0.207683682
59 27 pair 2 <NA> pc.value 0.298564351
60 28 pair 2 <NA> pc.value 0.186188623
61 29 adlib 2 <NA> pc.value 0.107437391
62 30 adlib 2 <NA> pc.value 0.161707111
63 32 adlib 2 <NA> pc.value 0.052134760
64 33 adlib 2 <NA> pc.value 0.200857395
65 34 pair 2 <NA> pc.value 0.189955861
66 35 adlib 2 <NA> pc.value 0.263397668
67 36 adlib 2 <NA> pc.value 0.036017649',head=T, fill=T)
dat$week_number = as.character(dat$week_number)
dat$condition = as.character(dat$condition)
dat$label = as.character(dat$label)
plt <- ggplot(dat, aes(x = week_number, y = value)) +
geom_boxplot(aes(fill=condition))
plt
答案 0 :(得分:2)
首先,this SO post中有一些关于单词边界的好例子和描述。字符边界匹配的精确位置在那里和this regex tutorial中列出。
但是,您的问题是为什么\b
在同一个地点匹配两次?
答案是单词边界属于非消费模式组,它们不会添加与输出匹配的文本,并且它们不会使正则表达式索引前进到结尾模式匹配,如果在模式之前或之后存在某些内容,它们只是断言。换句话说,这些是零宽度断言(正如Sebastian Proske所述)。
非消费模式是外观,锚点和单词边界。
那么,当你的正则表达式到达STACK
的末尾会发生什么?尾随\b
与2013
之前的位置相匹配,但正则表达式索引仍然存在于2013
之前。返回第一个匹配,下一个匹配从2013
之前的相同位置开始。模式中的第一个/前导\b
断言为真,因为2013
之前的位置是单词边界(在非单词之后和单词char之前)。
\b
是一个零宽度断言的点也可以通过在一个环视中使用它来说明:结果与lookbehind和lookahead相同:\b
= (?<=\b)
= (?!\b)
。他们都给出了相同的结果。