## 問題 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測試