## 问题 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.
- 贡献
- 作者
- 授权协议
- 1、Syntax
- 在服务端和客户端重用代码
- For循环
- 嵌入JavaScript代码
- 值域
- 2、Classes and Objects
- 类方法和实例方法
- CoffeeScript式的Type函数
- 链式调用
- 克隆对象(深度克隆)
- 不存在就赋值为对象字面量
- 类变量
- 3、Strings
- 分割字符串
- 字符串匹配
- 查找子字符串
- 让整个字符串小写
- 大写整个字符
- 去掉字符串首尾的空白
- 生成唯一的ID
- 首字母大写
- 重复字符串
- 字符串插值
- 4、Arrays
- Python式的Zip函数 Python-like Zip Function
- 数组去重 Removing Duplicate Elements from Arrays
- 基于数组构建字典对象 Creating a dictionary Object from an Array
- 数组转成字符串 Creating a String from an Array
- 检查每一个元素 Testing Every Element
- 数组最大值
- 过滤数组 Filtering Arrays
- 定义区间数组 Define Ranges Array
- 转置数组 Reversing Arrays
- 化简数组 Reducing Arrays
- 使用数组来做值交换 Using Arrays to Swap Variables
- 列表解析 List Comprehensions
- 检查值的类型是否是数组
- 连接数组
- 搅乱数组中的元素 Shuffling Array Elements
- 数组映射 Mapping Arrays
- 5、Dates and Times
- Calculate Phase of the Moon for a Date
- 找出某月的最后一天是几号 Finding the Last Day of the Month
- 获取两个日期相差的天数 Get Days Between Two Dates
- 计算复活节岛日期 Calculate the Date of Easter Sunday
- 计算感恩节的日期(美国和加拿大) Calculate the Date of Thanksgiving (USA and Canada)
- 计算上一个(下一个)月份 Finding Last (or Next) Month
- 6、Math
- 快速逆平方根
- 一个随机整数的函数
- 更快的斐波那契算法
- 生成可预测的随机数
- 弧度与度转换
- 生成随机数
- 数学常数
- 7、Functions
- 反抖动函数 Debounce Functions
- 参数数组化 Splat Arguments
- 当函数调用的括号不可以省略时 When Function Parentheses Are Not Optional
- 递归函数 Recursive Functions
- 8、Metaprogramming
- 扩展内置对象 Extending Built-in Objects
- 检测并创建缺失的函数 Detecting and Creating Missing Functions
- 9、jQuery
- 回调绑定
- 创建jQuery插件
- AJAX
- 10、Ajax
- 不依赖jQuery的Ajax请求 Ajax Request Without jQuery
- 11、Regular Expressions
- 替换子字符串 Replacing Substrings
- 使用定点 Using Heregexes
- 使用HTML字符实体替换HTML标签 Replacing HTML Tags with HTML Named Entities
- 搜索子字符串 Searching for Substrings
- 12、Networking
- 简单的服务器
- 双向客户端
- 最简单的HTTP客户端
- 最简单的HTTP服务器
- 简单的客户端
- 双向服务端 Bi-Directional Server
- 13、Design Patterns
- 命令模式
- 单例模式
- 策略模式 Strategy Pattern
- 建造者模式 Builder Pattern
- 备忘录模式 Memento Pattern
- 解释器模式 Interpreter Pattern
- 装饰者模式
- 桥接模式
- 工厂方法模式
- 14、Databases
- MongoDB
- SQLite
- 15、Testing
- 使用Jasmine测试