搜索子字符串 Searching for Substrings
最后更新于:2022-04-01 10:51:32
## 问题 Problem
你想搜索一个字符串,获取该子字符串匹配的起始位置或匹配值。
You need to search for a substring, and return either the starting position of the match or the matching value itself.
## 方法 Solution
使用正则表达式有好几种方法来实现,有些是调用`RegExp`字面量或者对象的方法,有的是调用`String`对象上的。
There are several ways to accomplish this using regular expressions. Some methods are called on a `RegExp` pattern or object and some are called on `String` objects.
### `RegExp`对象 `RegExp` objects
第一种方法是调用`RegExp`字面量或者对象上的`test`方法,这个`test`方法会返回一个布尔值: The first way is to call the `test` method on a`RegExp` pattern or object. The `test` method returns a boolean value:
~~~
match = /sample/.test("Sample text")
# => false
match = /sample/i.test("Sample text")
# => true
~~~
下一种方法是调用`RegExp`字面量或者对象的`exec`方法,这个方法会返回一个数组(包含了匹配信息)或者`null`;
The next way to is to call the `exec` method on a `RegExp` pattern or object. The `exec` method returns an array an array with the match information or `null`:
~~~
match = /s(amp)le/i.exec "Sample text"
# => [ 'Sample', 'amp', index: 0, input: 'Sample text' ]
match = /s(amp)le/.exec "Sample text"
# => null
~~~
### `String`对象 `String` objects
`match`方法对一个给定的字符串与`RegExp`匹配。如果带有`g`标志,则返回一个包含了所有匹配的数组,否则只返回第一个匹配值,或者返回`null`,如果没有匹配的话。
The `match` method matches a given string with the `RegExp`. With ‘g’ flag returns an array containing the matches, without ‘g’ flag returns just the first match or if no match is found returns `null`.
~~~
"Watch out for the rock!".match(/r?or?/g)
# => [ 'o', 'or', 'ro' ]
"Watch out for the rock!".match(/r?or?/)
# => [ 'o', index: 6, input: 'Watch out for the rock!' ]
"Watch out for the rock!".match(/ror/)
# => null
~~~
`search`用来做`RegExp`和字符串的匹配,如果匹配到就返回匹配的起始位置,否则返回-1。
The `search` method matches `RegExp` with string and returns the index of the beginning of the match if found, -1 if not.
~~~
"Watch out for the rock!".search /for/
# => 10
"Watch out for the rock!".search /rof/
# => -1
~~~
## 讨论 Discussion
正则表达式是一种测试或者匹配字串的强大的方式。
Regular Expressions are a powerful way to test and match substrings.