From Wikipedia, the free encyclopedia Từ Wikipedia tiếng Việt


[ edit ] Patterns for non-regular languages [Sửa] mẫu cho người không thường xuyên ngôn ngữ



tải về 308.69 Kb.
trang6/6
Chuyển đổi dữ liệu07.06.2018
Kích308.69 Kb.
#39586
1   2   3   4   5   6

[ edit ] Patterns for non-regular languages [Sửa] mẫu cho người không thường xuyên ngôn ngữ


Many features found in modern regular expression libraries provide an expressive power that far exceeds the regular languages . Nhiều tính năng hiện đại, thường xuyên được tìm thấy trong các thư viện cung cấp một biểu hiện expressive quyền lực mà vượt quá xa ngôn ngữ thường xuyên. For example, the ability to group subexpressions with parentheses and recall the value they match in the same expression means that a pattern can match strings of repeated words like " papa " or " WikiWiki ", called squares in formal language theory. Ví dụ, khả năng để nhóm subexpressions với ngoặc và gọi lại giá trị phù hợp với họ trong cùng một biểu hiện có nghĩa là một mô hình có thể phù hợp với những dây lặp đi lặp lại các từ như "cha" hoặc "WikiWiki", vuông gọi là ngôn ngữ chính thức trong lý thuyết. The pattern for these strings is (.*)\1 . Các mẫu cho các xâu là (.*)\1 However, the language of squares is not regular, nor is it context-free . Pattern matching with an unbounded number of back references, as supported by numerous modern tools, is NP-hard . Tuy nhiên, ngôn ngữ của ô vuông là không bình thường, nó cũng không phải là bối cảnh-miễn phí. Pattern kết hợp với một số unbounded trở lại tham chiếu, như hỗ trợ bởi nhiều công cụ hiện đại, là NP-khó.

However, many tools, libraries, and engines that provide such constructions still use the term regular expression for their patterns. Tuy nhiên, nhiều công cụ, thư viện, động cơ và cung cấp các công trình vẫn còn hạn sử dụng thường xuyên biểu hiện cho các mẫu của họ. This has led to a nomenclature where the term regular expression has different meanings in formal language theory and pattern matching. Điều này đã dẫn đến một nơi nomenclature thuật ngữ thường xuyên biểu hiện khác nhau có ý nghĩa trong ngôn ngữ chính thức lý thuyết và khuôn mẫu đối sánh. For this reason, some people have taken to using the term regex or simply pattern to describe the latter. Larry Wall (author of Perl) writes in Apocalypse 5: Vì lý do này, một số người đã dẫn đến hạn bằng cách sử dụng regex, hoặc đơn giản là mô hình để mô tả cái sau. Larry Wall (tác giả của Perl) viết trong Apocalypse 5:

"

'Regular expressions' [...] are only marginally related to real regular expressions. 'Biểu hiện thường xuyên' [...] marginally chỉ được thực tế liên quan đến các biểu thức bình thường. Nevertheless, the term has grown with the capabilities of our pattern matching engines, so I'm not going to try to fight linguistic necessity here. Tuy nhiên, thuật ngữ đã phát triển với khả năng của động cơ phù hợp với khuôn mẫu của chúng tôi, vì vậy tôi không đi để thử để đấu tranh ngôn ngữ cần thiết ở đây. I will, however, generally call them "regexes" (or "regexen", when I'm in an Anglo-Saxon mood). [ 2 ] Tôi sẽ, tuy nhiên, thông thường gọi cho họ "regexes" (hay "regexen", khi tôi đang ở một anglo-saxon mood). [2]

"

[ edit ] Implementations and running times [Sửa] triển khai và chạy lần


There are at least three essentially different algorithms that decide if and how a given regular expression matches a string. Hiện có ít nhất ba cơ bản khác nhau thuật toán rằng nếu quyết định như thế nào và là một biểu hiện thường xuyên cho phù hợp với một chuỗi.

The oldest and fastest two rely on a result in formal language theory that allows every nondeterministic finite state machine (NFA) to be transformed into a deterministic finite state machine (DFA). Các lâu đời nhất và nhanh nhất hai dựa vào kết quả trong một ngôn ngữ chính thức lý thuyết mà cho phép mỗi nondeterministic finite máy nhà nước (NFA) sẽ được chuyển đổi thành một deterministic finite máy nhà nước (DFA). The DFA can be constructed explicitly and then run on the resulting input string one symbol at a time. The DFA có thể được đầu tư xây dựng rõ ràng và sau đó chạy trên các kết quả đầu vào chuỗi một biểu tượng tại một thời gian. Constructing the DFA for a regular expression of size m has the time and memory cost of O ( 2 m ), but it can be run on a string of size n in time O ( n ). Xây dựng các DFA thường xuyên cho một biểu hiện của kích thước m có thời gian và chi phí của bộ nhớ O (2 m), nhưng nó có thể được chạy trên một dãy những kích thước n trong thời gian O (n). An alternative approach is to simulate the NFA directly, essentially building each DFA state on demand and then discarding it at the next step, possibly with caching. Thay thế là một cách tiếp cận để mô phỏng NFA trực tiếp, xây dựng cơ bản mỗi DFA nhà nước theo yêu cầu và sau đó discarding điều đó ở bước tiếp theo, có thể với bộ nhớ đệm. This keeps the DFA implicit and avoids the exponential construction cost, but running cost rises to O ( nm ). Điều này sẽ giúp các DFA chính và tránh các exponential chi phí xây dựng, nhưng chi phí cao hơn để chạy O (nm). The explicit approach is called the DFA algorithm and the implicit approach the NFA algorithm. Các phương pháp tiếp cận rõ ràng được gọi là DFA thuật toán và các phương pháp tiếp cận các chính NFA thuật toán. As both can be seen as different ways of executing the same DFA, they are also often called the DFA algorithm without making a distinction. Như cả hai có thể được xem như thực hiện nhiều cách khác nhau của cùng một DFA, mà chúng còn được thường gọi là thuật toán DFA mà không thực hiện một phân biệt. These algorithms are fast, but can only be used for matching and not for recalling grouped subexpressions, lazy quantification, and several other features commonly found in modern regular expression libraries. [ 4 ] Đây là thuật toán nhanh, nhưng chỉ có thể được sử dụng cho phù hợp và không cho RECALLING nhóm subexpressions, lười quantification, và một số các tính năng khác thường được tìm thấy trong các thư viện hiện đại biểu hiện thường xuyên. [4]

The third algorithm is to match the pattern against the input string by backtracking . Thứ ba là thuật toán để phù hợp với khuôn mẫu chống lại các dữ liệu vào chuỗi do backtracking. This algorithm is commonly called NFA, but this terminology can be confusing. Thuật toán này thường được gọi là NFA, nhưng thuật ngữ này có thể bị bối rối. Its running time can be exponential, which simple implementations exhibit when matching against expressions like (a|aa)*b that contain both alternation and unbounded quantification and force the algorithm to consider an exponentially increasing number of sub-cases. Thời gian hoạt động của nó có thể được exponential, mà đơn giản khi triển khai cuộc triển lãm chống lại phù hợp với biểu thức như (a|aa)*b có chứa cả hai đổi và unbounded quantification và lực lượng các thuật toán để xem xét một exponentially tăng số lượng phụ trường hợp. More complex implementations will often identify and speed up or abort common cases where they would otherwise run slowly. Phức tạp hơn sẽ triển khai thường xác định và tăng tốc độ hoặc hủy bỏ số trường hợp khác, nơi họ sẽ chạy chậm.

Although backtracking implementations give an exponential guarantee in the worst case, they provide much greater flexibility and expressive power. Mặc dù backtracking triển khai cho một exponential bảo đảm trong trường hợp xấu nhất, mà họ cung cấp nhiều tính linh hoạt cao hơn và expressive quyền lực. For example, any implementation which allows the use of backreferences, or implements the various extensions introduced by Perl, must use a backtracking implementation. Ví dụ, bất kỳ việc triển khai thực hiện cho phép việc sử dụng các backreferences, hoặc thực hiện các mở rộng giới thiệu Perl, phải sử dụng một backtracking việc triển khai thực hiện.

Some implementations try to provide the best of both algorithms by first running a fast DFA match to see if the string matches the regular expression at all, and only in that case perform a potentially slower backtracking match. Một số triển khai thử để cung cấp tốt nhất của cả hai thuật toán đầu tiên bằng cách chạy một nhanh DFA để xem có phù hợp với chuỗi khớp với thường xuyên ở tất cả các biểu hiện, và chỉ trong trường hợp đó thực hiện một backtracking phù hợp với khả năng chậm.

[ edit ] Regular expressions and Unicode [Sửa] biểu hiện thường xuyên và Unicode


Regular expressions were originally used with ASCII characters. Biểu thức thông thường được ban đầu được sử dụng với ASCII ký tự. Many regular expression engines can now handle Unicode . Nhiều người thường xuyên biểu hiện động cơ bây giờ có thể xử lý Unicode. In most respects it makes no difference what the character set is, but some issues do arise when extending regular expressions to support Unicode. Trong hầu hết các tôn trọng làm cho nó không có sự khác biệt những gì các ký tự được thiết lập, nhưng một số vấn đề nào phát sinh khi mở rộng biểu thức thông thường để hỗ trợ Unicode.

  • Supported encoding. Hỗ trợ mã hóa. Some regular expression libraries expect the UTF-8 encoding, while others might expect UTF-16 , or UTF-32 . Một số biểu hiện thường xuyên các thư viện chờ UTF-8 mã hóa, trong khi những người khác có thể chờ UTF-16, hay UTF-32.

  • Supported Unicode range. Unicode được hỗ trợ nhiều. Many regular expression engines support only the Basic Multilingual Plane , that is, the characters which can be encoded with only 16 bits. Nhiều người thường xuyên động cơ biểu hiện chỉ hỗ trợ các cơ bản Multilingual Plane, có nghĩa là, các ký tự mà có thể được mã hóa với chỉ 16 bit. Currently, only a few regular expression engines can handle the full 21-bit Unicode range. Hiện nay, chỉ có một vài biểu hiện thường xuyên động cơ có thể xử lý toàn bộ 21-bit Unicode nhiều.

  • Extending ASCII-oriented constructs to Unicode. Mở rộng ASCII-Unicode để hướng tới xây dựng. For example, in ASCII-based implementations, character ranges of the form [xy] are valid wherever x and y are codepoints in the range [0x00,0x7F] and codepoint(x) ≤ codepoint(y). Ví dụ, trong ASCII dựa trên triển khai, ký tự của các phạm vi toàn [xy] là hợp lệ xy ở bất cứ nơi nào có codepoints trong phạm vi [0x00, 0x7F] và codepoint (x) ≤ codepoint (y). The natural extension of such character ranges to Unicode would simply change the requirement that the endpoints lie in [0x00,0x7F] to the requirement that they lie in [0,0x10FFFF]. Tự nhiên mở rộng phạm vi của các ký tự Unicode sẽ chỉ đơn giản để thay đổi các yêu cầu rằng các endpoints nằm trong [0x00, 0x7F] để yêu cầu rằng họ nằm trong [0,0 x10FFFF]. However, in practice this is often not the case. Tuy nhiên, trong thực tế này thường không phải là trường hợp. Some implementations, such as that of gawk , do not allow character ranges to cross Unicode blocks. Một số triển khai, chẳng hạn như rằng của gawk, không cho phép ký tự Unicode qua các phạm vi khối. A range like [0x61,0x7F] is valid since both endpoints fall within the Basic Latin block, as is [0x0530,0x0560] since both endpoints fall within the Armenian block, but a range like [0x0061,0x0532] is invalid since it includes multiple Unicode blocks. Một phạm vi như [0x61, 0x7F] là hợp lệ kể từ khi cả hai endpoints rơi trong khối cơ bản Latin, như là [0x0530, 0x0560] kể từ khi cả hai endpoints rơi trong Armenian khối, nhưng một loạt như [0x0061, 0x0532] là không hợp lệ, vì nó sẽ bao gồm Unicode nhiều khối. Other engines, such as that of the Vim editor, allow block-crossing but limit the number of characters in a range to 128. Động cơ khác, chẳng hạn như rằng của Vim editor, cho phép khối-qua, nhưng giới hạn số ký tự trong một phạm vi đến 128.

  • Case insensitivity. Trường hợp insensitivity. Some case-insensitivity flags affect only the ASCII characters. Một số trường hợp-insensitivity cờ chỉ ảnh hưởng đến các ký tự ASCII. Other flags affect all characters. Các cờ ảnh hưởng đến tất cả các ký tự. Some engines have two different flags, one for ASCII, the other for Unicode. Một số động cơ có hai cờ khác nhau, một cho ASCII, các khác cho Unicode. Exactly which characters belong to the POSIX classes also varies. Chính xác các ký tự mà thuộc về posix các lớp học cũng khác nhau.

  • Cousins of case insensitivity. Cousins của trường hợp insensitivity. As the English alphabet has case distinction, case insensitivity became a logical feature in text searching. Alphabet như trong tiếng Anh, có trường hợp phân biệt, insensitivity đã trở thành một trường hợp lý tính năng tìm kiếm trong văn bản. Unicode introduced alphabetic scripts without case like Devanagari . Unicode giới thiệu Alphabetic script mà không có trường hợp như Devanagari. For these, case sensitivity is not applicable. Đối với những, cảm ứng không phải là trường hợp áp dụng. For scripts like Chinese, another distinction seems logical: between traditional and simplified. Cho script như Trung Quốc, khác biệt này có vẻ hợp lý: giữa cổ truyền và đơn giản. In Arabic scripts, insensitivity to initial, medial, final and isolated position may be desired. Trong tiếng Ả Rập scripts, insensitivity để ban đầu, trung gian, và cuối cùng cô lập vị trí có thể được mong muốn.

  • Normalization. Bình thường. Unicode introduced combining characters. Unicode giới thiệu, kết hợp các ký tự. Like old typewriters, plain letters can be followed by non-spacing accent symbols to form a single accented letter. Cũng giống như cũ chữ, đồng bằng chữ cái có thể được theo sau bởi non-accent biểu tượng dấu cách để tạo một thư accented. As a consequence, two different code sequences can result in identical character display. Như là một hậu quả, hai dãy nhiều đoạn mã khác nhau có thể kết quả giống hệt nhau trong hiển thị ký tự.

  • New control codes. Kiểm soát mã số mới. Unicode introduced amongst others, byte order marks and text direction markers. Unicode giới thiệu nằm trong số những người khác, byte thứ tự đánh dấu và văn bản hướng đánh dấu. These codes might have to be dealt with in a special way. Các mã này có thể phải được xử lý trong một cách đặc biệt.

  • Introduction of character classes for Unicode blocks and Unicode general character properties. Giới thiệu của ký tự cho các lớp học và Unicode Unicode khối tài sản chung ký tự. In Perl and the java.util.regex library, classes of the form \p{InX} match characters in block X and \P{InX} match the opposite. Trong Perljava.util.regex thư viện, các lớp học của các mẫu \p{InX} phù hợp với các ký tự trong khối X và \P{InX} phù hợp với đối diện. Similarly, \p{Armenian} matches any character in the Armenian block, and \p{X} matches any character with the general character property X . Tương tự, \p{Armenian} phù hợp với bất kỳ ký tự trong khối Armenian, và \p{X} phù hợp với bất kỳ ký tự với các tài sản chung ký tự X. For example, \p{Lu} matches any upper-case letter. Ví dụ, \p{Lu} phù hợp với bất kỳ trường hợp trên-thư.

[ edit ] Uses of regular expressions [Sửa] Sử dụng của các biểu thức bình thường


Regular expressions are useful in the production of syntax highlighting systems, data validation, and many other tasks. Biểu thức thông thường là hữu ích trong sản xuất của tô sáng cú pháp hệ thống thông tin, dữ liệu được xác nhận, và có rất nhiều các nhiệm vụ khác.

While regular expressions would be useful on search engines such as Google or Live Search , processing them across the entire database could consume excessive computer resources depending on the complexity and design of the regex. Trong khi các biểu thức bình thường sẽ là hữu ích trên công cụ tìm kiếm như Google hay Live Search, chế biến chúng trên toàn bộ cơ sở dữ liệu máy tính có thể tiêu thụ quá nhiều nguồn tài nguyên phụ thuộc vào sự phức tạp và thiết kế của regex. Although in many cases system administrators can run regex-based queries internally, most search engines do not offer regex support to the public. Mặc dù trong nhiều trường hợp hệ thống quản trị viên có thể chạy regex dựa trên truy vấn nội bộ, hầu hết các công cụ tìm kiếm regex tôi không cung cấp hỗ trợ cho công chúng. A notable exception is Google Code Search . Một danh là ngoại lệ Mã Tìm kiếm Google.

[ edit ] See also [Sửa] Xem thêm


  • Comparison of regular expression engines So sánh các biểu hiện thường xuyên động cơ

  • Extended Backus–Naur form Mở rộng Backus-Naur mẫu

  • List of regular expression software Danh sách các biểu hiện thường xuyên phần mềm

  • Regular expression examples Regular expression ví dụ

  • Regular tree grammar Thường xuyên cây ngữ pháp


tải về 308.69 Kb.

Chia sẻ với bạn bè của bạn:
1   2   3   4   5   6




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương