国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Swift > 正文

Swift中使用正則表達(dá)式的一些方法

2020-03-09 17:50:10
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Swift中使用正則表達(dá)式的一些方法,Swift語言對正則表達(dá)式的支持也在不斷改進(jìn)中,需要的朋友可以參考下
 

我使用Swift有段時間了,但最讓人郁悶的是它還不能支持正則表達(dá)式.

先要說的是,這確實是門新語言,我在網(wǎng)站上有注釋 a radar (rdar://17257306 for Apple folks). 如果你也認(rèn)同這一觀點,請支持.

我所說的正則表達(dá)式指的是這種(Ruby代碼):
 

if name =~ /ski$/ puts "#{name} is probably polish"end

如果要快速查詢,可以使用=~操作符來返回匹配的結(jié)果.此外使用/pattern/syntax 形式來直接使用正則. 除了/符號需要轉(zhuǎn)義,其它符號都不受影響:

 url_pattern = /^https?:////.*/


這比使用//轉(zhuǎn)義要好得多 (這在正則里很常見). 如果正則里使用了字符串,那看起來會很糟糕.這是Objective-C代碼:
 

復(fù)制代碼代碼如下:
NSRegularExpression *regex = [NSRegularExpression
  regularExpressionWithPattern:@"//s+//w{4,10}//s//d+"
                       options:0
                         error:nil];

 

轉(zhuǎn)義每個/符號讓代碼可讀性變差.  更別提額外類的創(chuàng)建了. 當(dāng)然,如果需要更強大的正則功能,那就得開發(fā)全套的特定實現(xiàn)類了.  但就一般情況來說 (在腳本語言里很常見) 有點小題大做.

Swift是怎么處理的?

Swift目前沒有提供支持正則的語法和類,所以只能使用之前提到的NSRegularExpression來實現(xiàn).

但是我們可以考慮使用swift的超強操作符來實現(xiàn). 考慮下面的場景:
 

復(fù)制代碼代碼如下:

class Regex {
  let internalExpression: NSRegularExpression
  let pattern: String
 
  init(_ pattern: String) {
    self.pattern = pattern
    var error: NSError?
    self.internalExpression = NSRegularExpression(pattern: pattern, options: .CaseInsensitive, error: &error)
  }
 
  func test(input: String) -> Bool {
    let matches = self.internalExpression.matchesInString(input, options: nil, range:NSMakeRange(0, countElements(input)))
    return matches.count > 0
  }
}

 

這在使用NSRegularExpression時需要提供大量的假設(shè)驗證. 如果用另一種方法就簡單多了:

 

復(fù)制代碼代碼如下:

if Regex("//w{4}").test("ABCD") {
  println("matches pattern")
}

 

我們還是無可避免的得使用字符串轉(zhuǎn)義,但比使用原生的NSRegularExpression好多了.

=~ 操作符

研究了一下 Step Christopher 的方法后,我想自己改造一下操作符功能. 看起來挺簡單的:
 

復(fù)制代碼代碼如下:

operator infix =~ {}

 

這就定義了操作符的位置,就像操作兩個元素時不是放在它們之間,而是一個元素之前或之后(就像++操作). 下面定義一個使用該操作符的函數(shù):

 

復(fù)制代碼代碼如下:

func =~ (input: String, pattern: String) -> Bool {
  return Regex(pattern).test(input)
}

 

復(fù)雜的部分是現(xiàn)成的,我們只需要簡單地調(diào)用.

最后,使用正則的測試結(jié)果如下:

 

復(fù)制代碼代碼如下:

let phoneNumber = "(800) 555-1111"
if phoneNumber =~ "(?//d{3})?//s//d{3}-//d{4}" {
  println("That looks like a valid US phone number")
}

 

我覺得這個結(jié)果很好,如果有天Apple發(fā)現(xiàn)了我的這個正則實現(xiàn)的語法/regex/literal syntax, 我很樂意提供支持.

更新

一個樂于助人的 Hacker News評論家  指出一個更接近我想要的方向,但使用現(xiàn)有的API:
 

復(fù)制代碼代碼如下:

if let match = name.rangeOfString("ski$", options: .RegularExpressionSearch) {
  println("/(name) is probably polish")
}

 

的確,我不知道這個,并且看起來非常有用。



注:相關(guān)教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 余姚市| 云和县| 西乌珠穆沁旗| 玉山县| 庄河市| 綦江县| 周宁县| 宣威市| 沿河| 闽侯县| 沽源县| 扎兰屯市| 柳河县| 武邑县| 石家庄市| 金堂县| 抚州市| 府谷县| 罗甸县| 通化市| 康乐县| 来安县| 弥渡县| 延庆县| 延吉市| 江阴市| 分宜县| 石狮市| 大足县| 松潘县| 来凤县| 莱西市| 屯门区| 红原县| 溧阳市| 潮安县| 清镇市| 桂林市| 商水县| 汉源县| 漳平市|