teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

コードの変更

2015/10/01 12:53

投稿

StupidDog
StupidDog

スコア263

answer CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  foreach($data as $subject) {
28
28
  print "=== string : {$subject} ===" . PHP_EOL;
29
- $pattern = "/(?![^!\?]+([!\?]{2,}))[^!\?]+[!\?]/";
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 = "/(?![^!\?]+([!\?]{2,}))[^!\?]+[!\?]/";
38
+ $pattern = "/(?![^!?]+([!?]{2,}))[^!?]+[!?]/";
39
39
  ```
40
40
 
41
- 前半の「(?![^!\?]+([!\?]{2,}))」が否定先読みにより
41
+ 前半の「(?![^!?]+([!?]{2,}))」が否定先読みにより
42
42
  **「後ろに感嘆符か疑問符の組み合わせを二つ以上持つ、感嘆符、疑問符を含まない文字列」**
43
43
  をマッチさせないようにして、
44
44
 
45
- 後半の「[^!\?]+[!\?]」により
45
+ 後半の「[^!?]+[!?]」により
46
46
  **「後ろに感嘆符か疑問符を一つ持つ、感嘆符と疑問符を含まない文字列」**
47
47
  にマッチさせるようにしています。
48
48
 

1

補足説明

2015/10/01 12:53

投稿

StupidDog
StupidDog

スコア263

answer CHANGED
@@ -47,4 +47,9 @@
47
47
  にマッチさせるようにしています。
48
48
 
49
49
  簡単なテストデータなのでバグがないとも言い切れませんが、
50
- 参考になれば幸いです。
50
+ 参考になれば幸いです。
51
+
52
+ ※補足
53
+ 正確には先読みや否定先読みは位置にマッチするので、今回の正規表現は、
54
+ **「後ろに感嘆符か疑問符の組み合わせを二つ以上持つ、感嘆符、疑問符を含まない文字列」**
55
+ にマッチしない**位置**を表し、その**位置**と後半の正規表現を合わせた条件になるようです。