正则表达式在第二场比赛中重复使用第一场比赛中的单词边界 - 为什么?

时间:2016-09-25 18:48:31

标签: java regex

给定字符串:

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

1 个答案:

答案 0 :(得分:2)

首先,this SO post中有一些关于单词边界的好例子和描述。字符边界匹配的精确位置在那里和this regex tutorial中列出。

但是,您的问题是为什么\b在同一个地点匹配两次?

答案是单词边界属于非消费模式组,它们不会添加与输出匹配的文本,并且它们不会使正则表达式索引前进到结尾模式匹配,如果在模式之前或之后存在某些内容,它们只是断言。换句话说,这些是零宽度断言(正如Sebastian Proske所述)。

非消费模式是外观,锚点和单词边界。

那么,当你的正则表达式到达STACK 的末尾会发生什么?尾随\b2013之前的位置相匹配,但正则表达式索引仍然存在于2013之前。返回第一个匹配,下一个匹配从2013之前的相同位置开始。模式中的第一个/前导\b断言为真,因为2013之前的位置是单词边界(在非单词之后和单词char之前)。

\b是一个零宽度断言的点也可以通过在一个环视中使用它来说明:结果与lookbehind和lookahead相同:\b = (?<=\b) = (?!\b)。他们都给出了相同的结果。