2013-05-06 25 views
8

Vì vậy, tôi hoàn toàn mới với thế giới áp đảo của Regex. Về cơ bản, tôi đang sử dụng API Gedit để tạo ra một đặc tả ngôn ngữ tùy chỉnh mới (bắt nguồn từ C#) để làm nổi bật cú pháp (đối với DM từ Byond). Trong các ký tự thoát trong DM, bạn phải sử dụng [biến] như một cú pháp thoát, đơn giản là đủ. Tuy nhiên, nó cũng có thể được lồng nhau, chẳng hạn như [mảng/danh sách [index]] chẳng hạn. (Nó có thể được lồng nhau vô hạn.) Tôi đã xem qua các câu hỏi khác, và khi họ hỏi về các khung lồng nhau, chúng chỉ có nghĩa là lồng nhau, trong khi trong trường hợp này, nó có thể là/hoặc.Biểu thức chính quy (Chân đế bình thường hoặc lồng ghép)

Một số nỗ lực Tôi đã thử:

  • \[.*\] tạo ra kết quả "Thử nghiệm [Test [Test] Test] Kiểm tra [Test] Test"
  • \[.*?\] sản xuất kết quả "Thử nghiệm [Test [Test] Test] thử nghiệm [Test] Test "
  • \[(?:.*)\]produces kết quả" thử nghiệm [Test [Test] Test] Kiểm tra [Test] Test"
  • \[(?:(?!\[|\]).)*\]produces kết quả "Test [Test [Test] Test] Thử nghiệm [Test] Test". Điều này có nguồn gốc từ https://stackoverflow.com/a/9580978/2303154 nhưng như đã đề cập ở trên, chỉ phù hợp nếu không có dấu ngoặc bên trong.

Rõ ràng là tôi không biết mình đang làm gì ở đây trong kết hợp phức tạp hơn, nhưng ít nhất tôi hiểu nhiều hơn về các hoạt động cơ bản từ các nguồn khác.

+3

Đọc kỹ [hướng dẫn này] (http://www.regular-expressions.info/tutorial.html) làm cho thế giới của regex bớt căng thẳng hơn rất nhiều. Ngoài ra, cấu trúc lồng nhau thường là nơi regex phương pháp tiếp cận sụp đổ - chỉ có hương vị regex của NET và cấu trúc hỗ trợ PCRE có thể đối phó với tổ chức vô hạn. –

+0

Thật không may vì nó là một API tôi không nghĩ rằng tôi có thể phân biệt và chỉ cần sử dụng những gì Gedit có XML làm cho phù hợp,; - ;. Và vâng, đó là một trong những hướng dẫn chính mà tôi đã xem xét. – Chaos7Theory

+0

Lần thử thứ 3 và thứ 4 của bạn không đúng định dạng cú pháp (do đó không khớp được gì trong chuỗi Thử nghiệm của bạn). Tôi đã sửa chúng. # 3: Phiên bản của bạn '\ [(?:. *)) \]' Có một khung đóng ngoặc kép. Hiệu chỉnh '\ [(?:. *) \]' Tương đương với số 1. Nhóm _non-capturing_ '(?:…)' Không có mục đích rõ ràng ở đây. # 4: Phiên bản của bạn '\ [?: (?! \ [| \]). * \]' Phần thể thao của cú pháp nhóm không bắt giữ - '?:' - không có dấu ngoặc tương ứng '(…)'. '(?: (?! \ [| \]).)' có thể được đơn giản hóa thành '[^ \] \ []' (các dấu gạch chéo ngược là tùy chọn khi liệt kê các ký tự của các lớp con theo thứ tự này: '[^] []'). –

Trả lời

1

Từ @Chaos7Theory:

Khi đọc GtkSourceView's Specification Reference, tôi đã tìm ra rằng nó sử dụng PCRE đặc biệt. Sau đó tôi sử dụng nó như một dẫn đầu.

Đào vào nó và thông qua thử-và-lỗi, tôi đã nhận nó để làm việc với:

\[(([^\[\]]*|(?R))*)\]

Tôi hy vọng điều này sẽ giúp người khác trong tương lai.

+0

@ Chaos7Theory: Cảm ơn bạn đã thực hiện Nghiên cứu về điều này và chia sẻ giải pháp! @ Alex: Cảm ơn bạn đã chuyển nó đến một câu trả lời đúng đắn! –

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