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

回答編集履歴

6

a

2016/04/10 02:32

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -4,13 +4,13 @@
4
4
  ```PHP
5
5
  <?php
6
6
  $str = 'そうですねabcの次はdefですね笑';
7
- preg_match('/([!-~]*)[^!-~]+笑\z/', $str, $matches);
7
+ preg_match('/([!-~]+)[^!-~]*笑\z/', $str, $matches);
8
8
  var_dump($matches);
9
9
  ```
10
10
 
11
11
 
12
12
  ```JavaScript
13
13
  var str = 'そうですねabcの次はdefですね笑';
14
- var regex = /([!-~]*)[^!-~]+笑$/;
14
+ var regex = /([!-~]+)[^!-~]*笑$/;
15
15
  console.log(str.match(regex));
16
16
  ```

5

a

2016/04/10 02:32

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -1,29 +1,9 @@
1
- PHP(PCREあるは鬼車を搭載した言語)だったらこう書くころです
1
+ ミスリーディングなこと書てたので消まし,結局皆さん同じですね…
2
+ 但し`\w`はアンダースコアも含んでしまうことに注意してください.
2
3
 
3
4
  ```PHP
4
5
  <?php
5
6
  $str = 'そうですねabcの次はdefですね笑';
6
- preg_match('/\A(.*)(?<!^|[!-~])([!-~]+)(.*)(笑)\z/', $str, $matches);
7
- var_dump($matches);
8
- ```
9
-
10
- JavaScriptなど戻り読みを使えない言語の場合は,初っ端から1オフセットごとに後ろをチェックしてしまう`.*?`を使わざるを得ないので,効率が少し悪くなります.
11
-
12
- ```JavaScript
13
- var str = 'そうですねabcの次はdefですね笑';
14
- var regex = /^(.*?)([!-~]+)([^!-~]*)(笑)$/;
15
- console.log(str.match(regex));
16
- ```
17
-
18
- ---
19
-
20
- 【追記】
21
-
22
- def以外をキャプチャする必要がない場合は`.*?`に対する憂慮も無くなりますね.
23
-
24
- ```PHP
25
- <?php
26
- $str = 'そうですねabcの次はdefですね笑';
27
7
  preg_match('/([!-~]*)[^!-~]+笑\z/', $str, $matches);
28
8
  var_dump($matches);
29
9
  ```

4

a

2016/04/10 02:31

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -24,13 +24,13 @@
24
24
  ```PHP
25
25
  <?php
26
26
  $str = 'そうですねabcの次はdefですね笑';
27
- preg_match('/([!-~]*)(?=[^!-~]+笑\z)/', $str, $matches);
27
+ preg_match('/([!-~]*)[^!-~]+笑\z/', $str, $matches);
28
28
  var_dump($matches);
29
29
  ```
30
30
 
31
31
 
32
32
  ```JavaScript
33
33
  var str = 'そうですねabcの次はdefですね笑';
34
- var regex = /([!-~]*)(?=[^!-~]+笑$)/;
34
+ var regex = /([!-~]*)[^!-~]+笑$/;
35
35
  console.log(str.match(regex));
36
36
  ```

3

a

2016/04/10 02:28

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -1,4 +1,4 @@
1
- PHPだったらこう書くところです.
1
+ PHP(PCREあるいは鬼車を搭載した言語)だったらこう書くところです.
2
2
 
3
3
  ```PHP
4
4
  <?php
@@ -7,10 +7,30 @@
7
7
  var_dump($matches);
8
8
  ```
9
9
 
10
- JavaScriptなど戻り読みを使えない言語の場合はちょっとややこしくなっちゃいますね.初っ端から1オフセットごとに後ろをチェックしてしまう`.*?`を使わざるを得ないので効率もあまり良くないです.
10
+ JavaScriptなど戻り読みを使えない言語の場合は初っ端から1オフセットごとに後ろをチェックしてしまう`.*?`を使わざるを得ないので効率が少し悪くなります.
11
11
 
12
12
  ```JavaScript
13
13
  var str = 'そうですねabcの次はdefですね笑';
14
14
  var regex = /^(.*?)([!-~]+)([^!-~]*)(笑)$/;
15
15
  console.log(str.match(regex));
16
16
  ```
17
+
18
+ ---
19
+
20
+ 【追記】
21
+
22
+ def以外をキャプチャする必要がない場合は`.*?`に対する憂慮も無くなりますね.
23
+
24
+ ```PHP
25
+ <?php
26
+ $str = 'そうですねabcの次はdefですね笑';
27
+ preg_match('/([!-~]*)(?=[^!-~]+笑\z)/', $str, $matches);
28
+ var_dump($matches);
29
+ ```
30
+
31
+
32
+ ```JavaScript
33
+ var str = 'そうですねabcの次はdefですね笑';
34
+ var regex = /([!-~]*)(?=[^!-~]+笑$)/;
35
+ console.log(str.match(regex));
36
+ ```

2

a

2016/04/10 02:26

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -3,7 +3,7 @@
3
3
  ```PHP
4
4
  <?php
5
5
  $str = 'そうですねabcの次はdefですね笑';
6
- preg_match('/\A(.*)(?<!^|[0-9a-zA-Z!-~])([0-9a-zA-Z!-~]+)(.*)(笑)\z/', $str, $matches);
6
+ preg_match('/\A(.*)(?<!^|[!-~])([!-~]+)(.*)(笑)\z/', $str, $matches);
7
7
  var_dump($matches);
8
8
  ```
9
9
 
@@ -11,6 +11,6 @@
11
11
 
12
12
  ```JavaScript
13
13
  var str = 'そうですねabcの次はdefですね笑';
14
- var regex = /^(.*?)([0-9a-zA-Z!-~]+)([^0-9a-zA-Z!-~]*)(笑)$/;
14
+ var regex = /^(.*?)([!-~]+)([^!-~]*)(笑)$/;
15
15
  console.log(str.match(regex));
16
16
  ```

1

a

2016/04/10 02:18

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -1,11 +1,3 @@
1
- JavaScriptの正規表現はまだ戻り読みを使えないのでちょっとややこしくなっちゃいますね.初っ端から1オフセットごとに後ろをチェックしてしまう`.*?`を使わざるを得ないので効率もあまり良くないです.
2
-
3
- ```JavaScript
4
- var str = 'そうですねabcの次はdefですね笑';
5
- var regex = /^(.*?)([0-9a-zA-Z!-~]+)([^0-9a-zA-Z!-~]*)(笑)$/;
6
- console.log(str.match(regex));
7
- ```
8
-
9
1
  PHPだったらこう書くところです.
10
2
 
11
3
  ```PHP
@@ -13,4 +5,12 @@
13
5
  $str = 'そうですねabcの次はdefですね笑';
14
6
  preg_match('/\A(.*)(?<!^|[0-9a-zA-Z!-~])([0-9a-zA-Z!-~]+)(.*)(笑)\z/', $str, $matches);
15
7
  var_dump($matches);
16
- ```
8
+ ```
9
+
10
+ JavaScriptなど戻り読みを使えない言語の場合はちょっとややこしくなっちゃいますね.初っ端から1オフセットごとに後ろをチェックしてしまう`.*?`を使わざるを得ないので効率もあまり良くないです.
11
+
12
+ ```JavaScript
13
+ var str = 'そうですねabcの次はdefですね笑';
14
+ var regex = /^(.*?)([0-9a-zA-Z!-~]+)([^0-9a-zA-Z!-~]*)(笑)$/;
15
+ console.log(str.match(regex));
16
+ ```