2013-08-09 64 views
5

Tôi đang viết một biểu thức chính quy trong Objective-C.Cái gì ? (chuỗi dấu chấm hỏi dấu chấm hỏi) có nghĩa là chuỗi thoát?

Trình tự thoát \w là bất hợp pháp và phát ra cảnh báo, do đó biểu thức chính quy /\w/ phải được viết là @"\\w"; trình tự thoát \?valid, apparently, và không phát ra cảnh báo, vì vậy biểu thức chính quy /\?/ phải được viết là @"\\?" (tức là dấu gạch chéo ngược phải được thoát).

Dấu hỏi không hiển thị như \t hoặc \n, vậy tại sao là \? chuỗi thoát hợp lệ?

Chỉnh sửa: Để làm rõ, tôi không hỏi về định lượng, tôi hỏi về chuỗi thoát chuỗi. Đó là, điều này không phát ra một cảnh báo:

NSString *valid = @"\?"; 

Ngược lại, này phát ra một cảnh báo ("Unknown thoát chuỗi '\ w'"):

NSString *invalid = @"\w"; 
+0

Nó có nghĩa là bạn đang cố gắng để phù hợp (tùy thuộc vào chức năng) một chữ '?'? – Jerry

+0

Bản sao có thể có của [Tại sao là "\?" một chuỗi thoát trong C/C++?] (http://stackoverflow.com/questions/19374878/why-is-an-escape-sequence-in-cc) (Mục tiêu-C kế thừa tính năng này từ C, vì vậy đây thực sự là một bản sao.) –

Trả lời

7

Nó chỉ định dấu chấm hỏi bằng chữ. Nó là cần thiết vì một tính năng ít được gọi là trigraphs, nơi bạn có thể viết một chuỗi gồm ba ký tự bắt đầu bằng dấu hỏi để thay thế một ký tự khác. Nếu bạn đã bật trigraphs, để viết "??" trong một chuỗi, bạn cần phải viết nó như là "?\?" để ngăn chặn các bộ tiền xử lý từ cố gắng để đọc nó như là sự khởi đầu của một dấu vết.

(Nếu bạn đang tự hỏi "Tại sao ai sẽ giới thiệu một tính năng như thế này?".. Một số bàn phím hoặc bộ ký tự không bao gồm những biểu tượng thường được sử dụng như { để họ giới thiệu trigraphs vì vậy bạn có thể viết ??< thay)

+1

Câu trả lời hay! Cảm ơn cho bối cảnh lịch sử quá. – smholloway

-1

? trong regex là một định lượng, nó có nghĩa là 0 hoặc 1 lần xuất hiện. Khi được nối vào các số liệu + hoặc *, nó làm cho nó "lười".

Ví dụ: áp dụng regex o? vào chuỗi foo? sẽ khớp với o.

Tuy nhiên, regex o\? trong foo? sẽ khớp với o?, bởi vì nó đang tìm kiếm dấu chấm hỏi trong chuỗi, thay vì số lượng tùy ý.

Áp dụng regex o*? đến foo? sẽ khớp với oo.

Thông tin thêm về định lượng here.

+2

Bạn đã hiểu lầm câu hỏi của tôi. Vui lòng đọc bản chỉnh sửa. – thomasd

Các vấn đề liên quan