回答編集履歴

2

コードの変更

2015/10/01 12:53

投稿

StupidDog
StupidDog

スコア263

test CHANGED
@@ -54,7 +54,7 @@
54
54
 
55
55
  print "=== string : {$subject} ===" . PHP_EOL;
56
56
 
57
- $pattern = "/(?![^!\?]+([!\?]{2,}))[^!\?]+[!\?]/";
57
+ $pattern = "/(?![^!?]+([!?]{2,}))[^!?]+[!?]/";
58
58
 
59
59
  if (preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER)) {
60
60
 
@@ -72,13 +72,13 @@
72
72
 
73
73
  ```php
74
74
 
75
- $pattern = "/(?![^!\?]+([!\?]{2,}))[^!\?]+[!\?]/";
75
+ $pattern = "/(?![^!?]+([!?]{2,}))[^!?]+[!?]/";
76
76
 
77
77
  ```
78
78
 
79
79
 
80
80
 
81
- 前半の「(?![^!\?]+([!\?]{2,}))」が否定先読みにより
81
+ 前半の「(?![^!?]+([!?]{2,}))」が否定先読みにより
82
82
 
83
83
  **「後ろに感嘆符か疑問符の組み合わせを二つ以上持つ、感嘆符、疑問符を含まない文字列」**
84
84
 
@@ -86,7 +86,7 @@
86
86
 
87
87
 
88
88
 
89
- 後半の「[^!\?]+[!\?]」により
89
+ 後半の「[^!?]+[!?]」により
90
90
 
91
91
  **「後ろに感嘆符か疑問符を一つ持つ、感嘆符と疑問符を含まない文字列」**
92
92
 

1

補足説明

2015/10/01 12:53

投稿

StupidDog
StupidDog

スコア263

test CHANGED
@@ -97,3 +97,13 @@
97
97
  簡単なテストデータなのでバグがないとも言い切れませんが、
98
98
 
99
99
  参考になれば幸いです。
100
+
101
+
102
+
103
+ ※補足
104
+
105
+ 正確には先読みや否定先読みは位置にマッチするので、今回の正規表現は、
106
+
107
+ **「後ろに感嘆符か疑問符の組み合わせを二つ以上持つ、感嘆符、疑問符を含まない文字列」**
108
+
109
+ にマッチしない**位置**を表し、その**位置**と後半の正規表現を合わせた条件になるようです。