回答編集履歴
2
コードの変更
test
CHANGED
@@ -54,7 +54,7 @@
|
|
54
54
|
|
55
55
|
print "=== string : {$subject} ===" . PHP_EOL;
|
56
56
|
|
57
|
-
$pattern = "/(?![^!
|
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 = "/(?![^!
|
75
|
+
$pattern = "/(?![^!?]+([!?]{2,}))[^!?]+[!?]/";
|
76
76
|
|
77
77
|
```
|
78
78
|
|
79
79
|
|
80
80
|
|
81
|
-
前半の「(?![^!
|
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
補足説明
test
CHANGED
@@ -97,3 +97,13 @@
|
|
97
97
|
簡単なテストデータなのでバグがないとも言い切れませんが、
|
98
98
|
|
99
99
|
参考になれば幸いです。
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
※補足
|
104
|
+
|
105
|
+
正確には先読みや否定先読みは位置にマッチするので、今回の正規表現は、
|
106
|
+
|
107
|
+
**「後ろに感嘆符か疑問符の組み合わせを二つ以上持つ、感嘆符、疑問符を含まない文字列」**
|
108
|
+
|
109
|
+
にマッチしない**位置**を表し、その**位置**と後半の正規表現を合わせた条件になるようです。
|