-
Notifications
You must be signed in to change notification settings - Fork 34
/
regular-expressions.json
1689 lines (1688 loc) · 95.1 KB
/
regular-expressions.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
{
"name": "Regular Expressions",
"order": 3,
"time": "5 hours",
"helpRoom": "Help",
"challenges": [
{
"id": "587d7db3367417b2b2512b8e",
"title": "Using the Test Method",
"description": [
"在编程语言中,正则表达式用于匹配指定的字符串。通过正则表达式创建匹配模式(规则)可以帮你完成指定匹配。",
"如果你想要在字符串<code>\"The dog chased the cat\"</code>中匹配到<code>\"the\"</code>这个单词,你可以使用如下正则表达式:<code>/the/</code>。注意,正则表达式中不需要引号。",
"JavaScript 中有多种使用正则表达式的方法。测试正则表达式的一种方法是使用<code>.test()</code>方法。<code>.test()</code>方法会把你编写的正则表达式应用到一个字符串(即括号内的内容),如果你的匹配模式成功匹配到字符,则返回<code>true</code>,反之,返回<code>false</code>。",
"<blockquote>let testStr = \"freeCodeCamp\";<br>let testRegex = /Code/;<br>testRegex.test(testStr);<br>// Returns true</blockquote>",
"<hr>",
"使用<code>.test()</code>方法,检测字符串<code>myString</code>是否符合正则表达式<code>myRegex</code>定义的规则。"
],
"tests": [
{
"text": "你应该使用<code>.test()</code>方法来检测正则表达式。",
"testString": "assert(code.match(/myRegex.test\\(\\s*myString\\s*\\)/), '你应该使用<code>.test()</code>方法来检测正则表达式。');"
},
{
"text": "你的返回结果应该为<code>true</code>。",
"testString": "assert(result === true, '你的返回结果应该为<code>true</code>。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let myString = \"Hello, World!\";",
"let myRegex = /Hello/;",
"let result = myRegex; // 修改这一行"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db3367417b2b2512b8f",
"title": "Match Literal Strings",
"description": [
"在上一个挑战中,你使用正则表达式<code>/Hello/</code>搜索到了字符串<code>\"Hello\"</code>。那个正则表达式在字符串中搜寻<code>\"Hello\"</code>的文字匹配。下面是另一个在字符串中搜寻<code>\"Kevin\"</code>的示例:",
"<blockquote>let testStr = \"Hello, my name is Kevin.\";<br>let testRegex = /Kevin/;<br>testRegex.test(testStr);<br>// Returns true</blockquote>",
"任何其他形式的<code>\"Kevin\"</code>都不会被匹配。例如,正则表达式<code>/Kevin/</code>不会匹配<code>\"kevin\"</code>或者<code>\"KEVIN\"</code>。",
"<blockquote>let wrongRegex = /kevin/;<br>wrongRegex.test(testStr);<br>// Returns false</blockquote>",
"后续的挑战将为你展示如何匹配其他形式的字符串。",
"<hr>",
"完成正则表达式<code>waldoRegex</code>,在字符串<code>waldoIsHiding</code>中匹配到文本<code>\"Waldo\"</code>。"
],
"tests": [
{
"text": "你的正则表达式<code>waldoRegex</code>应该匹配到<code>\"Waldo\"</code>。",
"testString": "assert(waldoRegex.test(waldoIsHiding), '你的正则表达式<code>waldoRegex</code>应该匹配到<code>\"Waldo\"</code>。');"
},
{
"text": "你的正则表达式<code>waldoRegex</code>不应该搜寻其他的任何内容。",
"testString": "assert(!waldoRegex.test('Somewhere is hiding in this text.'), '你的正则表达式<code>waldoRegex</code>不应该搜寻其他的任何内容。');"
},
{
"text": "你应该使用你的正则表达式对字符串执行文字匹配。",
"testString": "assert(!/\\/.*\\/i/.test(code), '你应该使用你的正则表达式对字符串执行文字匹配。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let waldoIsHiding = \"Somewhere Waldo is hiding in this text.\";",
"let waldoRegex = /search/; // 修改这一行",
"let result = waldoRegex.test(waldoIsHiding);"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db4367417b2b2512b90",
"title": "Match a Literal String with Different Possibilities",
"description": [
"使用正则表达式<code>/coding/</code>,你可以在其他字符串中查找<code>\"coding\"</code>。",
"这对于搜寻单个字符串非常有用,但仅限于一种匹配模式。你可以使用<code>|</code>操作符来匹配多个规则。",
"此操作符匹配在它之前或之后的匹配模式。例如,如果你想匹配<code>\"yes\"</code>或<code>\"no\"</code>,你需要的正则表达式是<code>/yes|no/</code>。",
"你还可以匹配多个规则,这可以通过添加更多的匹配模式来实现。这些匹配模式将包含更多的<code>|</code>操作符来分隔它们,比如<code>/yes|no|maybe/</code>。",
"<hr>",
"完成正则表达式<code>petRegex</code>以匹配<code>\"dog\"</code>、<code>\"cat\"</code>、<code>\"bird\"</code>或者<code>\"fish\"</code>。"
],
"tests": [
{
"text": "对于字符串<code>\"John has a pet dog.\"</code>,你的正则表达式<code>petRegex</code>的<code>test</code>方法应该返回<code>true</code>。",
"testString": "assert(petRegex.test('John has a pet dog.'), '对于字符串<code>\"John has a pet dog.\"</code>,你的正则表达式<code>petRegex</code>的<code>test</code>方法应该返回<code>true</code>。');"
},
{
"text": "对于字符串<code>\"Emma has a pet rock.\"</code>,你的正则表达式<code>petRegex</code>的<code>test</code>方法应该返回<code>false</code>。",
"testString": "assert(!petRegex.test('Emma has a pet rock.'), '对于字符串<code>\"Emma has a pet rock.\"</code>,你的正则表达式<code>petRegex</code>的<code>test</code>方法应该返回<code>false</code>。');"
},
{
"text": "对于字符串<code>\"Emma has a pet bird.\"</code>,你的正则表达式<code>petRegex</code>的<code>test</code>方法应该返回<code>true</code>。",
"testString": "assert(petRegex.test('Emma has a pet bird.'), '对于字符串<code>\"Emma has a pet bird.\"</code>,你的正则表达式<code>petRegex</code>的<code>test</code>方法应该返回<code>true</code>。');"
},
{
"text": "对于字符串<code>\"Liz has a pet cat.\"</code>,你的正则表达式<code>petRegex</code>的<code>test</code>方法应该返回<code>true</code>。",
"testString": "assert(petRegex.test('Liz has a pet cat.'), '对于字符串<code>\"Liz has a pet cat.\"</code>,你的正则表达式<code>petRegex</code>的<code>test</code>方法应该返回<code>true</code>。');"
},
{
"text": "对于字符串<code>\"Kara has a pet dolphin.\"</code>,你的正则表达式<code>petRegex</code>的<code>test</code>方法应该返回<code>false</code>。",
"testString": "assert(!petRegex.test('Kara has a pet dolphin.'), '对于字符串<code>\"Kara has a pet dolphin.\"</code>,你的正则表达式<code>petRegex</code>的<code>test</code>方法应该返回<code>false</code>。');"
},
{
"text": "对于字符串<code>\"Alice has a pet fish.\"</code>,你的正则表达式<code>petRegex</code>的<code>test</code>方法应该返回<code>true</code>。",
"testString": "assert(petRegex.test('Alice has a pet fish.'), '对于字符串<code>\"Alice has a pet fish.\"</code>,你的正则表达式<code>petRegex</code>的<code>test</code>方法应该返回<code>true</code>。');"
},
{
"text": "对于字符串<code>\"Jimmy has a pet computer.\"</code>,你的正则表达式<code>petRegex</code>的<code>test</code>方法应该返回<code>false</code>。",
"testString": "assert(!petRegex.test('Jimmy has a pet computer.'), '对于字符串<code>\"Jimmy has a pet computer.\"</code>,你的正则表达式<code>petRegex</code>的<code>test</code>方法应该返回<code>false</code>。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let petString = \"James has a pet cat.\";",
"let petRegex = /change/; // 修改这一行",
"let result = petRegex.test(petString);"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db4367417b2b2512b91",
"title": "Ignore Case While Matching",
"description": [
"到目前为止,你已经了解了如何用正则表达式来执行字符串的文字匹配。但有时候,你可能也想匹配不同的英文字母大小写。",
"大小写(或者字母大小写)是大写字母和小写字母的区别。大写字母的例子有<code>\"A\"</code>、<code>\"B\"</code>和<code>\"C\"</code>。小写字母的例子有<code>\"a\"</code>、<code>\"b\"</code>和<code>\"c\"</code>。",
"你可以使用标志(flag)来匹配这两种情况。标志有很多,不过这里我们只关注忽略大小写的标志——<code>i</code>。你可以通过将它附加到正则表达式之后来使用它。这里给出使用该标志的一个实例<code>/ignorecase/i</code>。这个字符串可以匹配字符串<code>\"ignorecase\"</code>、<code>\"igNoreCase\"</code>和<code>\"IgnoreCase\"</code>。",
"<hr>",
"编写正则表达式<code>fccRegex</code>以匹配<code>\"freeCodeCamp\"</code>,忽略大小写。你的正则表达式不应与任何缩写或带有空格的变体匹配。"
],
"tests": [
{
"text": "你的正则表达式应该匹配<code>freeCodeCamp</code>。",
"testString": "assert(fccRegex.test('freeCodeCamp'), '你的正则表达式应该匹配<code>freeCodeCamp</code>。');"
},
{
"text": "你的正则表达式应该匹配<code>FreeCodeCamp</code>。",
"testString": "assert(fccRegex.test('FreeCodeCamp'), '你的正则表达式应该匹配<code>FreeCodeCamp</code>。');"
},
{
"text": "你的正则表达式应该匹配<code>FreecodeCamp</code>。",
"testString": "assert(fccRegex.test('FreecodeCamp'), '你的正则表达式应该匹配<code>FreecodeCamp</code>。');"
},
{
"text": "你的正则表达式应该匹配<code>FreeCodecamp</code>。",
"testString": "assert(fccRegex.test('FreeCodecamp'), '你的正则表达式应该匹配<code>FreeCodecamp</code>。');"
},
{
"text": "你的正则表达式不应该匹配<code>Free Code Camp</code>。",
"testString": "assert(!fccRegex.test('Free Code Camp'), '你的正则表达式不应该匹配<code>Free Code Camp</code>。');"
},
{
"text": "Your regex should match<code>FreeCOdeCamp</code>。",
"testString": "assert(fccRegex.test('FreeCOdeCamp'), 'Your regex should match<code>FreeCOdeCamp</code>。');"
},
{
"text": "你的正则表达式不应该匹配<code>FCC</code>。",
"testString": "assert(!fccRegex.test('FCC'), '你的正则表达式不应该匹配<code>FCC</code>。');"
},
{
"text": "你的正则表达式应该匹配<code>FrEeCoDeCamp</code>。",
"testString": "assert(fccRegex.test('FrEeCoDeCamp'), '你的正则表达式应该匹配<code>FrEeCoDeCamp</code>。');"
},
{
"text": "你的正则表达式应该匹配<code>FrEeCodECamp</code>。",
"testString": "assert(fccRegex.test('FrEeCodECamp'), '你的正则表达式应该匹配<code>FrEeCodECamp</code>。');"
},
{
"text": "你的正则表达式应该匹配<code>FReeCodeCAmp</code>。",
"testString": "assert(fccRegex.test('FReeCodeCAmp'), '你的正则表达式应该匹配<code>FReeCodeCAmp</code>。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let myString = \"freeCodeCamp\";",
"let fccRegex = /change/; // 修改这一行",
"let result = fccRegex.test(myString);"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db4367417b2b2512b92",
"title": "Extract Matches",
"description": [
"到目前为止,你只是检查了一个匹配模式是否存在于字符串中。你还可以使用<code>.match()</code>方法来提取你找到的实际匹配项。",
"请使用字符串来调用<code>.match()</code>方法,并在括号内传入正则表达式。以下是一个示例:",
"<blockquote>\"Hello, World!\".match(/Hello/);<br>// Returns [\"Hello\"]<br>let ourStr = \"Regular expressions\";<br>let ourRegex = /expressions/;<br>ourStr.match(ourRegex);<br>// Returns [\"expressions\"]</blockquote>",
"<hr>",
"利用<code>.match()</code>方法提取单词<code>coding</code>。"
],
"tests": [
{
"text": "<code>结果</code>应该包含单词<code>coding</code>。",
"testString": "assert(result.join() === \"coding\", '<code>结果</code>应该包含单词<code>coding</code>。');"
},
{
"text": "你的正则表达式<code>codingRegex</code>应该搜寻<code>coding</code>。",
"testString": "assert(codingRegex.source === \"coding\", '你的正则表达式<code>codingRegex</code>应该搜寻<code>coding</code>。');"
},
{
"text": "你应该使用<code>.match()</code>方法。",
"testString": "assert(code.match(/\\.match\\(.*\\)/), '你应该使用<code>.match()</code>方法。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let extractStr = \"Extract the word 'coding' from this string.\";",
"let codingRegex = /change/; // 修改这一行",
"let result = extractStr; // 修改这一行"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db4367417b2b2512b93",
"title": "Find More Than the First Match",
"description": [
"到目前为止,你只能提取或搜寻一次匹配模式。",
"<blockquote>let testStr = \"Repeat, Repeat, Repeat\";<br>let ourRegex = /Repeat/;<br>testStr.match(ourRegex);<br>// Returns [\"Repeat\"]</blockquote>",
"若要多次搜寻或提取匹配模式,你可以使用<code>g</code>标志。",
"<blockquote>let repeatRegex = /Repeat/g;<br>testStr.match(repeatRegex);<br>// Returns [\"Repeat\", \"Repeat\", \"Repeat\"]</blockquote>",
"<hr>",
"使用正则表达式<code>starRegex</code>,从字符串<code>twinkleStar</code>中匹配到所有的<code>\"Twinkle\"</code>单词并提取出来。",
"<strong>注意:</strong><br>在正则表达式上可以有多个标志,比如<code>/search/gi</code>。"
],
"tests": [
{
"text": "你的正则表达式<code>starRegex</code>应该使用全局标志<code>g</code>。",
"testString": "assert(starRegex.flags.match(/g/).length == 1, '你的正则表达式<code>starRegex</code>应该使用全局标志<code>g</code>。');"
},
{
"text": "你的正则表达式<code>starRegex</code>应该使用忽略大小写标志<code>i</code>。",
"testString": "assert(starRegex.flags.match(/i/).length == 1, '你的正则表达式<code>starRegex</code>应该使用忽略大小写标志<code>i</code>。');"
},
{
"text": "你的匹配应该匹配单词<code>\"Twinkle\"</code>的两个匹配项。",
"testString": "assert(result.sort().join() == twinkleStar.match(/twinkle/gi).sort().join(), '你的匹配应该匹配单词<code>\"Twinkle\"</code>的两个匹配项。');"
},
{
"text": "你的匹配<code>结果</code>应该包含两个元素。",
"testString": "assert(result.length == 2, '你的匹配<code>结果</code>应该包含两个元素。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let twinkleStar = \"Twinkle, twinkle, little star\";",
"let starRegex = /change/; // 修改这一行",
"let result = twinkleStar; // 修改这一行"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db5367417b2b2512b94",
"title": "Match Anything with Wildcard Period",
"description": [
"有时你不会(或不需要)知道匹配模式中的确切字符。如果要精确匹配到完整的单词,那出现一个拼写错误就会匹配不到。幸运的是,你可以使用通配符<code>.</code>来处理这种情况。",
"通配符<code>.</code>将匹配任何一个字符。通配符也叫<code>dot</code>或<code>period</code>。你可以像使用正则表达式中任何其他字符一样使用通配符。例如,如果你想匹配<code>\"hug\"</code>、<code>\"huh\"</code>、<code>\"hut\"</code>和<code>\"hum\"</code>,你可以使用正则表达式<code>/hu./</code>匹配以上四个单词。",
"<blockquote>let humStr = \"I'll hum a song\";<br>let hugStr = \"Bear hug\";<br>let huRegex = /hu./;<br>humStr.match(huRegex); // Returns [\"hum\"]<br>hugStr.match(huRegex); // Returns [\"hug\"]</blockquote>",
"<hr>",
"完成正则表达式<code>unRegex</code>以匹配字符串<code>\"run\"</code>、<code>\"sun\"</code>、<code>\"fun\"</code>、<code>\"pun\"</code>、<code>\"nun\"</code>和<code>\"bun\"</code>。你的正则表达式中应该使用通配符。"
],
"tests": [
{
"text": "你应该使用<code>.test()</code>方法。",
"testString": "assert(code.match(/\\.test\\(.*\\)/), '你应该使用<code>.test()</code>方法。');"
},
{
"text": "你应该在你的正则表达式<code>unRegex</code>中使用通配符。",
"testString": "assert(/\\./.test(unRegex.source), '你应该在你的正则表达式<code>unRegex</code>中使用通配符。');"
},
{
"text": "你的正则表达式<code>unRegex</code>应该在字符串<code>\"Let us go on a run.\"</code>中匹配到<code>\"run\"</code>单词。",
"testString": "assert(unRegex.test(\"Let us go on a run.\"), '你的正则表达式<code>unRegex</code>应该在字符串<code>\"Let us go on a run.\"</code>中匹配到<code>\"run\"</code>单词。');"
},
{
"text": "你的正则表达式<code>unRegex</code>应该在字符串<code>\"The sun is out today.\"</code>中匹配到<code>\"sun\"</code>单词。",
"testString": "assert(unRegex.test(\"The sun is out today.\"), '你的正则表达式<code>unRegex</code>应该在字符串<code>\"The sun is out today.\"</code>中匹配到<code>\"sun\"</code>单词。');"
},
{
"text": "你的正则表达式<code>unRegex</code>应该在字符串<code>\"Coding is a lot of fun.\"</code>中匹配到<code>\"fun\"</code>单词。",
"testString": "assert(unRegex.test(\"Coding is a lot of fun.\"), '你的正则表达式<code>unRegex</code>应该在字符串<code>\"Coding is a lot of fun.\"</code>中匹配到<code>\"fun\"</code>单词。');"
},
{
"text": "你的正则表达式<code>unRegex</code>应该在字符串<code>\"Seven days without a pun makes one weak.\"</code>中匹配到<code>\"pun\"</code>单词。",
"testString": "assert(unRegex.test(\"Seven days without a pun makes one weak.\"), '你的正则表达式<code>unRegex</code>应该在字符串<code>\"Seven days without a pun makes one weak.\"</code>中匹配到<code>\"pun\"</code>单词。');"
},
{
"text": "你的正则表达式<code>unRegex</code>应该在字符串<code>\"One takes a vow to be a nun.\"</code>中匹配到<code>\"nun\"</code>单词。",
"testString": "assert(unRegex.test(\"One takes a vow to be a nun.\"), '你的正则表达式<code>unRegex</code>应该在字符串<code>\"One takes a vow to be a nun.\"</code>中匹配到<code>\"nun\"</code>单词。');"
},
{
"text": "你的正则表达式<code>unRegex</code>应该在字符串<code>\"She got fired from the hot dog stand for putting her hair in a bun.\"</code>中匹配到<code>\"bun\"</code>单词。",
"testString": "assert(unRegex.test(\"She got fired from the hot dog stand for putting her hair in a bun.\"), '你的正则表达式<code>unRegex</code>应该在字符串<code>\"She got fired from the hot dog stand for putting her hair in a bun.\"</code>中匹配到<code>\"bun\"</code>单词。');"
},
{
"text": "你的正则表达式<code>unRegex</code>不应该匹配<code>\"There is a bug in my code.\"</code>。",
"testString": "assert(!unRegex.test(\"There is a bug in my code.\"), '你的正则表达式<code>unRegex</code>不应该匹配<code>\"There is a bug in my code.\"</code>。');"
},
{
"text": "你的正则表达式<code>unRegex</code>不应该匹配<code>\"Catch me if you can.\"</code>。",
"testString": "assert(!unRegex.test(\"Can me if you can.\"), '你的正则表达式<code>unRegex</code>不应该匹配<code>\"Catch me if you can.\"</code>。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let exampleStr = \"Let's have fun with regular expressions!\";",
"let unRegex = /change/; // 修改这一行",
"let result = unRegex.test(exampleStr);"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db5367417b2b2512b95",
"title": "Match Single Character with Multiple Possibilities",
"description": [
"你已经了解了如何匹配文字匹配模式(<code>/literal/</code>)和通配符(<code>/./</code>)。这是正则表达式的两种极端情况,一种是精确匹配,而另一种则是匹配所有。在这两种极端情况之间有一个平衡选项。",
"你可以使用<code>字符集</code>搜寻具有一定灵活性的文字匹配模式。字符集允许你通过把它们放在方括号(<code>[</code>和<code>]</code>)之间的方式来定义一组你需要匹配的字符串。",
"例如,你想要匹配<code>\"bag\"</code>、<code>\"big\"</code>和<code>\"bug\"</code>,但是不想匹配<code>\"bog\"</code>。你可以创建正则表达式<code>/b[aiu]g/</code>来执行此操作。<code>[aiu]</code>是只匹配字符<code>\"a\"</code>、<code>\"i\"</code>或者<code>\"u\"</code>的字符集。",
"<blockquote>let bigStr = \"big\";<br>let bagStr = \"bag\";<br>let bugStr = \"bug\";<br>let bogStr = \"bog\";<br>let bgRegex = /b[aiu]g/;<br>bigStr.match(bgRegex); // Returns [\"big\"]<br>bagStr.match(bgRegex); // Returns [\"bag\"]<br>bugStr.match(bgRegex); // Returns [\"bug\"]<br>bogStr.match(bgRegex); // Returns null</blockquote>",
"<hr>",
"使用元音字符集(<code>a</code>、<code>e</code>、<code>i</code>、<code>o</code>、<code>u</code>)在你的正则表达式<code>vowelRegex</code>中匹配到字符串<code>quoteSample</code>中的所有元音。",
"<strong>注意</strong><br>一定要同时匹配大小写元音。"
],
"tests": [
{
"text": "你应该匹配到所有25个元音。",
"testString": "assert(result.length == 25, '你应该匹配到所有25个元音。');"
},
{
"text": "你的正则表达式<code>vowelRegex</code>应该使用字符集。",
"testString": "assert(/\\[.*\\]/.test(vowelRegex.source), '你的正则表达式<code>vowelRegex</code>应该使用字符集。');"
},
{
"text": "你的正则表达式<code>vowelRegex</code>应该使用全局标志。",
"testString": "assert(vowelRegex.flags.match(/g/).length == 1, '你的正则表达式<code>vowelRegex</code>应该使用全局标志。');"
},
{
"text": "你的正则表达式<code>vowelRegex</code>应该使用忽略大小写标志。",
"testString": "assert(vowelRegex.flags.match(/i/).length == 1, '你的正则表达式<code>vowelRegex</code>应该使用忽略大小写标志。');"
},
{
"text": "你的正则表达式不应该匹配任何辅音。",
"testString": "assert(!/[b-df-hj-np-tv-z]/gi.test(result.join()), '你的正则表达式不应该匹配任何辅音。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let quoteSample = \"Beware of bugs in the above code; I have only proved it correct, not tried it.\";",
"let vowelRegex = /change/; // 修改这一行",
"let result = vowelRegex; // 修改这一行"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db5367417b2b2512b96",
"title": "Match Letters of the Alphabet",
"description": [
"你了解了如何使用<code>字符集</code>来指定要匹配的一组字符串,但是当你需要匹配大量字符(例如,字母表中的每个字母)时,有一种写法可以让实现这个功能变得简短。",
"在<code>字符集</code>中,你可以使用<code>连字符</code>(<code>-</code>)来定义要匹配的字符范围。",
"例如,要匹配小写字母<code>a</code>到<code>e</code>,你可以使用<code>[a-e]</code>。",
"<blockquote>let catStr = \"cat\";<br>let batStr = \"bat\";<br>let matStr = \"mat\";<br>let bgRegex = /[a-e]at/;<br>catStr.match(bgRegex); // Returns [\"cat\"]<br>batStr.match(bgRegex); // Returns [\"bat\"]<br>matStr.match(bgRegex); // Returns null</blockquote>",
"<hr>",
"匹配字符串<code>quoteSample</code>中的所有字母。",
"<strong>注意:</strong><br>一定要同时匹配大小写<strong>字母<strong>。"
],
"tests": [
{
"text": "你的正则表达式<code>alphabetRegex</code>应该匹配 35 项。",
"testString": "assert(result.length == 35, '你的正则表达式<code>alphabetRegex</code>应该匹配 35 项。');"
},
{
"text": "你的正则表达式<code>alphabetRegex</code>应该使用全局标志。",
"testString": "assert(alphabetRegex.flags.match(/g/).length == 1, '你的正则表达式<code>alphabetRegex</code>应该使用全局标志。');"
},
{
"text": "你的正则表达式<code>alphabetRegex</code>应该使用忽略大小写标志。",
"testString": "assert(alphabetRegex.flags.match(/i/).length == 1, '你的正则表达式<code>alphabetRegex</code>应该使用忽略大小写标志。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let quoteSample = \"The quick brown fox jumps over the lazy dog.\";",
"let alphabetRegex = /change/; // 修改这一行",
"let result = alphabetRegex; // 修改这一行"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db5367417b2b2512b97",
"title": "Match Numbers and Letters of the Alphabet",
"description": [
"使用连字符(<code>-</code>)匹配字符范围并不仅限于字母。它还可以匹配一系列数字。",
"例如,<code>/[0-5]/</code>匹配<code>0</code>和<code>5</code>之间的任意数字,包含<code>0</code>和<code>5</code>。",
"此外,还可以在单个字符集中组合一系列字母和数字。",
"<blockquote>let jennyStr = \"Jenny8675309\";<br>let myRegex = /[a-z0-9]/ig;<br>// matches all letters and numbers in jennyStr<br>jennyStr.match(myRegex);</blockquote>",
"<hr>",
"创建一个正则表达式,使其可以匹配<code>h</code>和<code>s</code>之间的一系列字母,以及<code>2</code>和<code>6</code>之间的一系列数字。请记得在正则表达式中包含恰当的标志。"
],
"tests": [
{
"text": "你的正则表达式<code>myRegex</code>应该匹配 17 项。",
"testString": "assert(result.length == 17, '你的正则表达式<code>myRegex</code>应该匹配 17 项。');"
},
{
"text": "你的正则表达式<code>myRegex</code>应该使用全局标志。",
"testString": "assert(myRegex.flags.match(/g/).length == 1, '你的正则表达式<code>myRegex</code>应该使用全局标志。');"
},
{
"text": "你的正则表达式<code>myRegex</code>应该使用忽略大小写的标志。",
"testString": "assert(myRegex.flags.match(/i/).length == 1, '你的正则表达式<code>myRegex</code>应该使用忽略大小写的标志。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let quoteSample = \"Blueberry 3.141592653s are delicious.\";",
"let myRegex = /change/; // 修改这一行",
"let result = myRegex; // 修改这一行"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db6367417b2b2512b98",
"title": "Match Single Characters Not Specified",
"description": [
"到目前为止,你已创建了一个你想要匹配的字符集合,但你也可以创建一个你不想匹配的字符集合。这些类型的字符集称为<code>否定字符集</code>。",
"要创建<code>否定字符集</code>,你需要在开始括号后面和不想匹配的字符前面放置<code>插入字符</code>(即<code>^</code>)。",
"例如,<code>/[^aeiou]/gi</code>匹配所有非元音字符。注意,字符<code>.</code>、<code>!</code>、<code>[</code>、<code>@</code>、<code>/</code>和空白字符等也会被匹配,该否定字符集仅排除元音字符。",
"<hr>",
"创建一个匹配所有非数字或元音字符的正则表达式。请记得在正则表达式中包含恰当的标志。"
],
"tests": [
{
"text": "你的正则表达式<code>myRegex</code>应该匹配 9 项。",
"testString": "assert(result.length == 9, '你的正则表达式<code>myRegex</code>应该匹配 9 项。');"
},
{
"text": "你的正则表达式<code>myRegex</code>应该使用全局标志。",
"testString": "assert(myRegex.flags.match(/g/).length == 1, '你的正则表达式<code>myRegex</code>应该使用全局标志。');"
},
{
"text": "你的正则表达式<code>myRegex</code>应该使用忽略大小写标志。",
"testString": "assert(myRegex.flags.match(/i/).length == 1, '你的正则表达式<code>myRegex</code>应该使用忽略大小写标志。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let quoteSample = \"3 blind mice.\";",
"let myRegex = /change/; // 修改这一行",
"let result = myRegex; // 修改这一行"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db6367417b2b2512b99",
"title": "Match Characters that Occur One or More Times",
"description": [
"有时,你需要匹配出现一次或者连续多次的的字符(或字符组)。这意味着它至少出现一次,并且可能重复出现。",
"你可以使用<code>+</code>符号来检查情况是否如此。记住,字符或匹配模式必须一个接一个地连续出现。",
"例如,<code>/a+/g</code>会在<code>\"abc\"</code>中匹配到一个匹配项,并且返回<code>[\"a\"]</code>。因为<code>+</code>的存在,它也会在<code>\"aabc\"</code>中匹配到一个匹配项,然后返回<code>[\"aa\"]</code>。",
"如果它是检查字符串<code>\"abab\"</code>,它将匹配到两个匹配项并且返回<code>[\"a\", \"a\"]</code>,因为<code>a</code>字符不连续,在它们之间有一个<code>b</code>字符。最后,因为在字符串<code>\"bcd\"</code>中没有<code>\"a\"</code>,因此找不到匹配项。",
"<hr>",
"你希望在字符串<code>\"Mississippi\"</code>中匹配到出现一次或多次的字母<code>s</code>的匹配项。编写一个使用<code>+</code>符号的正则表达式。"
],
"tests": [
{
"text": "你的正则表达式<code>myRegex</code>应该使用<code>+</code>符号来匹配一个或多个<code>s</code>字符。",
"testString": "assert(/\\+/.test(myRegex.source), '你的正则表达式<code>myRegex</code>应该使用<code>+</code>符号来匹配一个或多个<code>s</code>字符。');"
},
{
"text": "你的正则表达式<code>myRegex</code>应该匹配两项。",
"testString": "assert(result.length == 2, '你的正则表达式<code>myRegex</code>应该匹配两项。');"
},
{
"text": "<code>结果</code>变量应该是一个包含两个<code>\"ss\"</code>匹配项的数组。",
"testString": "assert(result[0] == 'ss' && result[1] == 'ss', '<code>结果</code>变量应该是一个包含两个<code>\"ss\"</code>匹配项的数组。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let difficultSpelling = \"Mississippi\";",
"let myRegex = /change/; // 修改这一行",
"let result = difficultSpelling.match(myRegex);"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db6367417b2b2512b9a",
"title": "Match Characters that Occur Zero or More Times",
"description": [
"上一次的挑战中使用了加号<code>+</code>来查找出现一次或多次的字符。还有一个选项可以匹配出现零次或多次的字符。",
"执行该操作的字符叫做<code>asterisk</code>或<code>star</code>,即<code>*</code>。",
"<blockquote>let soccerWord = \"gooooooooal!\";<br>let gPhrase = \"gut feeling\";<br>let oPhrase = \"over the moon\";<br>let goRegex = /go*/;<br>soccerWord.match(goRegex); // Returns [\"goooooooo\"]<br>gPhrase.match(goRegex); // Returns [\"g\"]<br>oPhrase.match(goRegex); // Returns null</blockquote>",
"<hr>",
"创建一个变量为<code>chewieRegex</code>的正则表达式,使用<code>*</code>符号在<code>chewieQuote</code>中匹配所有的<code>\"A\"</code>和<code>\"a\"</code>。它不需要修饰符,也不需要匹配引号。"
],
"tests": [
{
"text": "你的正则表达式<code>chewieRegex</code>应该使用<code>*</code>符号匹配零个或多个<code>a</code>字符。",
"testString": "assert(/\\*/.test(chewieRegex.source), '你的正则表达式<code>chewieRegex</code>应该使用<code>*</code>符号匹配零个或多个<code>a</code>字符。');"
},
{
"text": "你的正则表达式<code>chewieRegex</code>应该匹配 16 个字符。",
"testString": "assert(result[0].length === 16, '你的正则表达式<code>chewieRegex</code>应该匹配 16 个字符。');"
},
{
"text": "你的正则表达式应该匹配<code>\"Aaaaaaaaaaaaaaaa\"</code>。",
"testString": "assert(result[0] === 'Aaaaaaaaaaaaaaaa', '你的正则表达式应该匹配<code>\"Aaaaaaaaaaaaaaaa\"</code>。');"
},
{
"text": "你的正则表达式在<code>\"He made a fair move. Screaming about it can't help you.\"</code>中不应该匹配任何字符。",
"testString": "assert(!\"He made a fair move. Screaming about it can\\'t help you.\".match(chewieRegex), '你的正则表达式在<code>\"He made a fair move. Screaming about it can't help you.\"</code>中不应该匹配任何字符。');"
},
{
"text": "你的正则表达式在<code>\"Let him have it. It's not wise to upset a Wookiee.\"</code>中不应该匹配任何字符。",
"testString": "assert(!\"Let him have it. It\\'s not wise to upset a Wookiee.\".match(chewieRegex), '你的正则表达式在<code>\"Let him have it. It's not wise to upset a Wookiee.\"</code>中不应该匹配任何字符。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let chewieQuote = \"Aaaaaaaaaaaaaaaarrrgh!\";",
"let chewieRegex = /change/; // 修改这一行",
"let result = chewieQuote.match(chewieRegex);"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db6367417b2b2512b9b",
"title": "Find Characters with Lazy Matching",
"description": [
"在正则表达式中,<code>贪婪</code>匹配会匹配到符合正则表达式匹配模式的字符串的最长可能部分,并将其作为匹配项返回。另一种方案称为<code>懒惰</code>匹配,它会匹配到满足正则表达式的字符串的最小可能部分。",
"你可以将正则表达式<code>/t[a-z]*i/</code>应用于字符串<code>\"titanic\"</code>。这个正则表达式是一个以<code>t</code>开始,以<code>i</code>结束,并且中间有一些字母的匹配模式。",
"正则表达式默认是<code>贪婪</code>匹配,因此匹配返回为<code>[\"titani\"]</code>。它会匹配到适合该匹配模式的最大子字符串。",
"但是,你可以使用<code>?</code>字符来将其变成<code>懒惰</code>匹配。调整后的正则表达式<code>/t[a-z]*?i/</code>匹配字符串<code>\"titanic\"</code>返回<code>[\"ti\"]</code>。",
"<hr>",
"修复正则表达式<code>/<.*>/</code>,让它返回 HTML 标签<code><h1></code>,而不是文本<code>\"<h1>Winter is coming</h1>\"</code>。请记得在正则表达式中使用通配符<code>.</code>来匹配任意字符。"
],
"tests": [
{
"text": "<code>结果</code>变量应该是一个包含<code><h1></code>的数组。",
"testString": "assert(result[0] == '<h1>', '<code>结果</code>变量应该是一个包含<code><h1></code>的数组。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let text = \"<h1>Winter is coming</h1>\";",
"let myRegex = /<.*>/; // 修改这一行",
"let result = text.match(myRegex);"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db7367417b2b2512b9c",
"title": "Find One or More Criminals in a Hunt",
"description": [
"是时候暂停和测试你的新正则表达式写作技巧了。一群罪犯逃出监狱逃跑,但你不知道有多少人。但是,你知道他们和其他人在一起时会保持紧密联系。你有责任立刻找到所有的罪犯。",
"这里有一个示例来回顾如何做到这一点:",
"当字母<code>z</code>在一行中出现一次或连续多次时,正则表达式<code>/z+/</code>会匹配到它。它会在以下所有字符串中找到匹配项:",
"<blockquote>\"z\"<br>\"zzzzzz\"<br>\"ABCzzzz\"<br>\"zzzzABC\"<br>\"abczzzzzzzzzzzzzzzzzzzzzabc\"</blockquote>",
"但是它不会在以下字符串中找到匹配项,因为它们中没有字母<code>z</code>:",
"<blockquote>\"\"<br>\"ABC\"<br>\"abcabc\"</blockquote>",
"<hr>",
"编写一个<code>贪婪</code>正则表达式,在一组其他人中匹配到一个或多个罪犯。罪犯由大写字母<code>C</code>表示。"
],
"tests": [
{
"text": "你的正则表达式应该匹配<code>\"C\"</code>中的 <em>一个</em> 罪犯(\"<code>C</code>\")。",
"testString": "assert('C'.match(reCriminals) && 'C'.match(reCriminals)[0] == 'C', '你的正则表达式应该匹配<code>\"C\"</code>中的 <em>一个</em> 罪犯(\"<code>C</code>\")。');"
},
{
"text": "你的正则表达式应该匹配<code>\"CC\"</code>中的 <em>两个</em> 罪犯(\"<code>CC</code>\")。",
"testString": "assert('CC'.match(reCriminals) && 'CC'.match(reCriminals)[0] == 'CC', '你的正则表达式应该匹配<code>\"CC\"</code>中的 <em>两个</em> 罪犯(\"<code>CC</code>\")。');"
},
{
"text": "你的正则表达式应该匹配<code>\"P1P5P4CCCP2P6P3\"</code>中的 <em>三个</em> 罪犯(\"<code>CCC</code>\")。",
"testString": "assert('P1P5P4CCCP2P6P3'.match(reCriminals) && 'P1P5P4CCCP2P6P3'.match(reCriminals)[0] == 'CCC', '你的正则表达式应该匹配<code>\"P1P5P4CCCP2P6P3\"</code>中的 <em>三个</em> 罪犯(\"<code>CCC</code>\")。');"
},
{
"text": "你的正则表达式应该匹配<code>\"P6P2P7P4P5CCCCCP3P1\"</code>中的 <em>五个</em> 罪犯(\"<code>CCCCC</code>\")。",
"testString": "assert('P6P2P7P4P5CCCCCP3P1'.match(reCriminals) && 'P6P2P7P4P5CCCCCP3P1'.match(reCriminals)[0] == 'CCCCC', '你的正则表达式应该匹配<code>\"P6P2P7P4P5CCCCCP3P1\"</code>中的 <em>五个</em> 罪犯(\"<code>CCCCC</code>\")。');"
},
{
"text": "你的正则表达式在<code>\"\"</code>中不应该匹配到任何罪犯。",
"testString": "assert(!reCriminals.test(''), '你的正则表达式在<code>\"\"</code>中不应该匹配到任何罪犯。');"
},
{
"text": "你的正则表达式在<code>\"P1P2P3\"</code>中不应该匹配到任何罪犯。",
"testString": "assert(!reCriminals.test('P1P2P3'), '你的正则表达式在<code>\"P1P2P3\"</code>中不应该匹配到任何罪犯。');"
},
{
"text": "你的正则表达式应该匹配<code>\"P2P1P5P4CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCP3\"</code>中的 <em>五十个</em> 罪犯(\"<code>CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC</code>\")。",
"testString": "assert('P2P1P5P4CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCP3'.match(reCriminals) && 'P2P1P5P4CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCP3'.match(reCriminals)[0] == \"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\", '你的正则表达式应该匹配<code>\"P2P1P5P4CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCP3\"</code>中的 <em>五十个</em> 罪犯(\"<code>CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC</code>\")。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"// example crowd gathering",
"let crowd = 'P1P2P3P4P5P6CCCP7P8P9';",
"",
"let reCriminals = /./; // 修改这一行",
"",
"let matchedCriminals = crowd.match(reCriminals);",
"console.log(matchedCriminals);"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db7367417b2b2512b9d",
"title": "Match Beginning String Patterns",
"description": [
"先前的挑战表明,正则表达式可以用于查找许多匹配项。它们还用于搜寻字符串中特定位置的匹配模式。",
"在之前的挑战中,你使用<code>字符集</code>中的<code>插入</code>符号(<code>^</code>)来创建一个<code>否定字符集</code>,形如<code>[^thingsThatWillNotBeMatched]</code>。在<code>字符集</code>之外,<code>插入</code>符号用于字符串的开头搜寻匹配模式。",
"<blockquote>let firstString = \"Ricky is first and can be found.\";<br>let firstRegex = /^Ricky/;<br>firstRegex.test(firstString);<br>// Returns true<br>let notFirst = \"You can't find Ricky now.\";<br>firstRegex.test(notFirst);<br>// Returns false</blockquote>",
"<hr>",
"在正则表达式中使用<code>^</code>符号,以匹配仅在字符串<code>rickyAndCal</code>的开头出现的<code>\"Cal\"</code>。"
],
"tests": [
{
"text": "你的正则表达式应该搜寻有一个大写字母的<code>\"Cal\"</code>。",
"testString": "assert(calRegex.source == \"^Cal\", '你的正则表达式应该搜寻有一个大写字母的<code>\"Cal\"</code>。');"
},
{
"text": "你的正则表达式不应该使用任何标志。",
"testString": "assert(calRegex.flags == \"\", '你的正则表达式不应该使用任何标志。');"
},
{
"text": "你的正则表达式应该匹配字符串开头的<code>\"Cal\"</code>。",
"testString": "assert(calRegex.test(\"Cal and Ricky both like racing.\"), '你的正则表达式应该匹配字符串开头的<code>\"Cal\"</code>。');"
},
{
"text": "你的正则表达式不应该匹配字符串中间的<code>\"Cal\"</code>。",
"testString": "assert(!calRegex.test(\"Ricky and Cal both like racing.\"), '你的正则表达式不应该匹配字符串中间的<code>\"Cal\"</code>。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let rickyAndCal = \"Cal and Ricky both like racing.\";",
"let calRegex = /change/; // 修改这一行",
"let result = calRegex.test(rickyAndCal);"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db7367417b2b2512b9e",
"title": "Match Ending String Patterns",
"description": [
"在上一个挑战中,你学习了使用<code>^</code>符号来搜寻字符串开头的匹配模式。还有一种方法可以搜寻字符串末尾的匹配模式。",
"你可以使用正则表达式的<code>美元</code>符号<code>$</code>来搜寻字符串的结尾。",
"<blockquote>let theEnding = \"This is a never ending story\";<br>let storyRegex = /story$/;<br>storyRegex.test(theEnding);<br>// Returns true<br>let noEnding = \"Sometimes a story will have to end\";<br>storyRegex.test(noEnding);<br>// Returns false<br></blockquote>",
"<hr>",
"使用<code>$</code>在字符串<code>caboose</code>的末尾匹配<code>\"caboose\"</code>。"
],
"tests": [
{
"text": "你应该在正则表达式使用美元符号<code>$</code>来搜寻<code>\"caboose\"</code>。",
"testString": "assert(lastRegex.source == \"caboose$\", '你应该在正则表达式使用美元符号<code>$</code>来搜寻<code>\"caboose\"</code>。');"
},
{
"text": "你的正则表达式不应该使用任何标志。",
"testString": "assert(lastRegex.flags == \"\", '你的正则表达式不应该使用任何标志。');"
},
{
"text": "你应该在字符串<code>\"The last car on a train is the caboose\"</code>的末尾匹配<code>\"caboose\"</code>。",
"testString": "assert(lastRegex.test(\"The last car on a train is the caboose\"), '你应该在字符串<code>\"The last car on a train is the caboose\"</code>的末尾匹配<code>\"caboose\"</code>。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let caboose = \"The last car on a train is the caboose\";",
"let lastRegex = /change/; // 修改这一行",
"let result = lastRegex.test(caboose);"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db7367417b2b2512b9f",
"title": "Match All Letters and Numbers",
"description": [
"使用字符类,你可以使用<code>[a-z]</code>搜寻字母表中的所有字母。这种字符类是很常见的,它有一个缩写,但这个缩写也包含额外的字符。",
"JavaScript 中与字母表匹配的最接近的字符类是<code>\\w</code>,这个缩写等同于<code>[A-Za-z0-9_]</code>。它不仅可以匹配大小写字母和数字,注意,它还会匹配下划线字符(<code>_</code>)。",
"<blockquote>let longHand = /[A-Za-z0-9_]+/;<br>let shortHand = /\\w+/;<br>let numbers = \"42\";<br>let varNames = \"important_var\";<br>longHand.test(numbers); // Returns true<br>shortHand.test(numbers); // Returns true<br>longHand.test(varNames); // Returns true<br>shortHand.test(varNames); // Returns true</blockquote>",
"<hr>",
"使用缩写<code>\\w</code>来计算所有引号中字母和数字字符的数量。"
],
"tests": [
{
"text": "你的正则表达式应该使用全局状态修正符。",
"testString": "assert(alphabetRegexV2.global, '你的正则表达式应该使用全局状态修正符。');"
},
{
"text": "你的正则表达式应该在<code>\"The five boxing wizards jump quickly.\"</code>中匹配到 31 个字母数字字符。",
"testString": "assert(\"The five boxing wizards jump quickly.\".match(alphabetRegexV2).length === 31, '你的正则表达式应该在<code>\"The five boxing wizards jump quickly.\"</code>中匹配到 31 个字母数字字符。');"
},
{
"text": "你的正则表达式应该在<code>\"Pack my box with five dozen liquor jugs.\"</code>中匹配到 32 个字母数字字符。",
"testString": "assert(\"Pack my box with five dozen liquor jugs.\".match(alphabetRegexV2).length === 32, '你的正则表达式应该在<code>\"Pack my box with five dozen liquor jugs.\"</code>中匹配到 32 个字母数字字符。');"
},
{
"text": "你的正则表达式应该在<code>\"How vexingly quick daft zebras jump!\"</code>中匹配到 30 个字母数字字符。",
"testString": "assert(\"How vexingly quick daft zebras jump!\".match(alphabetRegexV2).length === 30, '你的正则表达式应该在<code>\"How vexingly quick daft zebras jump!\"</code>中匹配到 30 个字母数字字符。');"
},
{
"text": "你的正则表达式应该在<code>\"123 456 7890 ABC def GHI jkl MNO pqr STU vwx YZ.\"</code>中匹配到 36 个字母数字字符。",
"testString": "assert(\"123 456 7890 ABC def GHI jkl MNO pqr STU vwx YZ.\".match(alphabetRegexV2).length === 36, '你的正则表达式应该在<code>\"123 456 7890 ABC def GHI jkl MNO pqr STU vwx YZ.\"</code>中匹配到 36 个字母数字字符。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let quoteSample = \"The five boxing wizards jump quickly.\";",
"let alphabetRegexV2 = /change/; // 修改这一行",
"let result = quoteSample.match(alphabetRegexV2).length;"
],
"head": [],
"tail": []
}
}
},
{
"id": "587d7db8367417b2b2512ba0",
"title": "Match Everything But Letters and Numbers",
"description": [
"你已经了解到可以使用缩写<code>\\w</code>来匹配字母和数字<code>[A-Za-z0-9_]</code>。不过,有可能你想要搜寻的匹配模式与字母数字相反。",
"你可以使用<code>\\W</code>搜寻和<code>\\w</code>相反的匹配模式。注意,相反匹配模式使用大写字母。此缩写与<code>[^A-Za-z0-9_]</code>是一样的。",
"<blockquote>let shortHand = /\\W/;<br>let numbers = \"42%\";<br>let sentence = \"Coding!\";<br>numbers.match(shortHand); // Returns [\"%\"]<br>sentence.match(shortHand); // Returns [\"!\"]<br></blockquote>",
"<hr>",
"使用缩写<code>\\W</code>来计算不同引号和字符串中非字母数字字符的数量。"
],
"tests": [
{
"text": "你的正则表达式应该使用全局状态修正符。",
"testString": "assert(nonAlphabetRegex.global, '你的正则表达式应该使用全局状态修正符。');"
},
{
"text": "你的正则表达式应该在<code>\"The five boxing wizards jump quickly.\"</code>中匹配到 6 个非字母数字字符。",
"testString": "assert(\"The five boxing wizards jump quickly.\".match(nonAlphabetRegex).length == 6, '你的正则表达式应该在<code>\"The five boxing wizards jump quickly.\"</code>中匹配到 6 个非字母数字字符。');"
},
{
"text": "你的正则表达式应该在<code>\"Pack my box with five dozen liquor jugs.\"</code>中匹配到 8 个非字母数字字符。",
"testString": "assert(\"Pack my box with five dozen liquor jugs.\".match(nonAlphabetRegex).length == 8, '你的正则表达式应该在<code>\"Pack my box with five dozen liquor jugs.\"</code>中匹配到 8 个非字母数字字符。');"
},
{
"text": "你的正则表达式应该在<code>\"How vexingly quick daft zebras jump!\"</code>中匹配到 6 个非字母数字字符。",
"testString": "assert(\"How vexingly quick daft zebras jump!\".match(nonAlphabetRegex).length == 6, '你的正则表达式应该在<code>\"How vexingly quick daft zebras jump!\"</code>中匹配到 6 个非字母数字字符。');"
},
{
"text": "你的正则表达式应该在<code>\"123 456 7890 ABC def GHI jkl MNO pqr STU vwx YZ.\"</code>中匹配到 12 个非字母数字字符。",
"testString": "assert(\"123 456 7890 ABC def GHI jkl MNO pqr STU vwx YZ.\".match(nonAlphabetRegex).length == 12, '你的正则表达式应该在<code>\"123 456 7890 ABC def GHI jkl MNO pqr STU vwx YZ.\"</code>中匹配到 12 个非字母数字字符。');"
}
],
"solutions": [],
"hints": [],
"releasedOn": "Feb 17, 2017",
"challengeType": 1,
"files": {
"indexjs": {
"key": "indexjs",
"ext": "js",
"name": "index",
"contents": [
"let quoteSample = \"The five boxing wizards jump quickly.\";",
"let nonAlphabetRegex = /change/; // 修改这一行",
"let result = quoteSample.match(nonAlphabetRegex).length;"
],
"head": [],
"tail": []
}
}
},
{
"id": "5d712346c441eddfaeb5bdef",
"title": "Match All Numbers",
"description": [
"你已经了解了常见字符串匹配模式和缩写,如字母数字。另一个常见的匹配模式是只寻找数字。",
"查找数字字符的缩写是<code>\\d</code>,注意是小写的<code>d</code>。这等同于字符类<code>[0-9]</code>,它查找 0 到 9 之间任意数字的单个字符。",
"<hr>",
"使用缩写<code>\\d</code>来计算电影标题中有多少个数字。书面数字(\"six\" 而不是 6)不计算在内。"
],
"tests": [
{
"text": "你的正则表达式应该使用缩写来匹配数字字符。",
"testString": "assert(/\\\\d/.test(numRegex.source), '你的正则表达式应该使用缩写来匹配数字字符。');"
},
{
"text": "你的正则表达式应该使用全局状态修正符。",
"testString": "assert(numRegex.global, '你的正则表达式应该使用全局状态修正符。');"
},
{
"text": "你的正则表达式应该在<code>\"9\"</code>中匹配到 1 个数字。",
"testString": "assert(\"9\".match(numRegex).length == 1, '你的正则表达式应该在<code>\"9\"</code>中匹配到 1 个数字。');"
},
{
"text": "你的正则表达式应该在<code>\"Catch 22\"</code>中匹配到 2 个数字。",
"testString": "assert(\"Catch 22\".match(numRegex).length == 2, '你的正则表达式应该在<code>\"Catch 22\"</code>中匹配到 2 个数字。');"
},
{
"text": "你的正则表达式应该在<code>\"101 Dalmatians\"</code>中匹配到 3 个数字。",
"testString": "assert(\"101 Dalmatians\".match(numRegex).length == 3, '你的正则表达式应该在<code>\"101 Dalmatians\"</code>中匹配到 3 个数字。');"
},
{
"text": "你的正则表达式在<code>\"One, Two, Three\"</code>中应该匹配不到数字。",
"testString": "assert(\"One, Two, Three\".match(numRegex) == null, '你的正则表达式在<code>\"One, Two, Three\"</code>中应该匹配不到数字。');"
},
{
"text": "你的正则表达式应该在<code>\"21 Jump Street\"</code>中匹配到 2 个数字。",
"testString": "assert(\"21 Jump Street\".match(numRegex).length == 2, '你的正则表达式应该在<code>\"21 Jump Street\"</code>中匹配到 2 个数字。');"
},
{
"text": "你的正则表达式应该在<code>\"2001: A Space Odyssey\"</code>中匹配到 4 个数字。",
"testString": "assert(\"2001: A Space Odyssey\".match(numRegex).length == 4, '你的正则表达式应该在<code>\"2001: A Space Odyssey\"</code>中匹配到 4 个数字。');"