回答編集履歴
2
コードの変更
answer
CHANGED
@@ -26,7 +26,7 @@
|
|
26
26
|
|
27
27
|
foreach($data as $subject) {
|
28
28
|
print "=== string : {$subject} ===" . PHP_EOL;
|
29
|
-
$pattern = "/(?![^!
|
29
|
+
$pattern = "/(?![^!?]+([!?]{2,}))[^!?]+[!?]/";
|
30
30
|
if (preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER)) {
|
31
31
|
print_r($matches);
|
32
32
|
}
|
@@ -35,14 +35,14 @@
|
|
35
35
|
|
36
36
|
正規表現部分の説明です。
|
37
37
|
```php
|
38
|
-
$pattern = "/(?![^!
|
38
|
+
$pattern = "/(?![^!?]+([!?]{2,}))[^!?]+[!?]/";
|
39
39
|
```
|
40
40
|
|
41
|
-
前半の「(?![^!
|
41
|
+
前半の「(?![^!?]+([!?]{2,}))」が否定先読みにより
|
42
42
|
**「後ろに感嘆符か疑問符の組み合わせを二つ以上持つ、感嘆符、疑問符を含まない文字列」**
|
43
43
|
をマッチさせないようにして、
|
44
44
|
|
45
|
-
後半の「[^!
|
45
|
+
後半の「[^!?]+[!?]」により
|
46
46
|
**「後ろに感嘆符か疑問符を一つ持つ、感嘆符と疑問符を含まない文字列」**
|
47
47
|
にマッチさせるようにしています。
|
48
48
|
|
1
補足説明
answer
CHANGED
@@ -47,4 +47,9 @@
|
|
47
47
|
にマッチさせるようにしています。
|
48
48
|
|
49
49
|
簡単なテストデータなのでバグがないとも言い切れませんが、
|
50
|
-
参考になれば幸いです。
|
50
|
+
参考になれば幸いです。
|
51
|
+
|
52
|
+
※補足
|
53
|
+
正確には先読みや否定先読みは位置にマッチするので、今回の正規表現は、
|
54
|
+
**「後ろに感嘆符か疑問符の組み合わせを二つ以上持つ、感嘆符、疑問符を含まない文字列」**
|
55
|
+
にマッチしない**位置**を表し、その**位置**と後半の正規表現を合わせた条件になるようです。
|