2014-09-07 3 views
0

У меня есть это регулярное выражение:Regex Работает в Perl, Не так NSRegularExpresson

([^\ \t\r\n\[\{\(\-])?'(?(1)|(?=\s | s\b)) 

со следующей подстановкой:

$1’ 

Это, кажется, работает в Perl. Учитывая фразу типа «King Solomon's Mines», она изменит ее на King Solomon’s Mines, но она выдает ошибку EXC_BAD_ACCESS как NSRegularExpression. This test suite предполагает, что синтаксис действителен в php и Python, но не в Javascript, и что часть (?(1) является виновником.

Пример Swift код:

let string = "King Solomon's Mines" 
var anError: NSError? = nil 
let pattern = "([^\\ \\t\\r\\n\\[\\{\\(\\-])?'(?(1)|(?=\\s | s\\b))" 
let regex = NSRegularExpression(pattern: pattern, options: .CaseInsensitive, error: &anError) 
let range = NSMakeRange(0, countElements(string)) 
let template = "$1’" 
let newString = regex.stringByReplacingMatchesInString(string, options: nil, range: range, withTemplate: template) 

let regex декларация, где площадка получит плохую ошибку доступа. Мне нужно изменить регулярное выражение, чтобы заставить его работать в Swift?

(Edit: забыл поставить в побегах для обратных косых черт я, что в моем коде.).

+0

Вы хотите заменить '' 'на' ’ '? – hjpotter92

+0

Линия 'let pattern = ...' вообще не компилируется (несколько ошибок «неправильной escape-последовательности в буквальном»). –

+0

Вы пытаетесь использовать это регулярное выражение точно? В NSRegularExpression используется регулярное выражение ICU, а не регулярное выражение Perl. Существуют различия между этими двумя вкусами, а также необходимость избегать некоторых строк в Swift, таких как обратная косая черта. Убедитесь, что регулярное выражение соответствует синтаксису регулярного выражения ICU, а также экрану, требуемому строками Swift. – ColGraff

ответ

0

Я не думаю, что условный тест (?(1)...|...) доступен, но это не проблема, так как он не нужен. Эта модель делает то же самое:

let pattern = "'(?:(?<=[^\\s[{(-]')|(?=\\s | s\\b))" 

Примечания: если это не сработает, попробуйте удвоить избежать открытий квадратных скобок в классе символов.

+0

Этот шаблон с двойными обратными косыми чертами перед первым '[', исправляет ошибку, но не работает, заменяет '' 'на' ’ ' – davextreme

+0

@ davextreme: Обратите внимание, что поскольку нет больше группы захвата в этом шаблоне, замена должна быть: 'let template =" ’ ". –

+0

Решил: пробел в 's | вызвала проблему. Принимая это или добавляя .AllowCommentsAndWhitespace сделал трюк: 'let pattern = '' (?: (? <= [^ \\ s [{(-] ') | (? = \\ s | s \\ b)) "' и 'let regex = NSRegularExpression (pattern: pattern, options: .CaseInsensitive | .AllowCommentsAndWhitespace, error: & anError)' – davextreme