2012-03-28 36 views
9

Tôi muốn sử dụng \w regex để cho phép số alpha nhưng tôi không muốn gạch dưới _ là một phần của nó. Kể từ _ được bao gồm trong \w. Vì vậy, tôi đã mã hóa như thế này nhưng không hoạt động, sai lầm của tôi là gì?loại trừ gạch dưới từ số alpha regex

(/^roger\w{2,3}[0-9a-z]/i) 

Tôi đang mong đợi bất kỳ ký tự khác ngoài AZ hoặc 1-2 được loại trừ

cũ - roger3_2 or roger46_ or roger2_

nhưng

roger54 hoặc roger4a hoặc roger455 hoặc rogerAAA

sẽ là o k

+2

Làm thế nào doesn Nó có hoạt động không? Xin vui lòng cho biết thêm chi tiết. – Bojangles

+0

Bạn có lẽ nên thêm đầu vào và đầu ra dự kiến ​​... – Stefan

Trả lời

6
  • Một điểm mã số là \pN hoặc \p{Number}.
  • Một điểm mã chữ số là \d, \p{digit}, \p{Nd}, \p{Decimal_Number} hoặc \p{Numeric_Type=Decimal}.
  • Điểm mã chữ cái là \p{alpha} hoặc \p{Alphabetic}. Nó bao gồm tất cả các điểm \p{Digit}, \p{Letter}\p{Letter_Number} mã, cũng như một số điểm \p{Mark}\p{Symbol} nhất định.
  • Điểm mã từ lập trình là \w hoặc [\p{Alphabetic}\p{Digit}\p{Mark}\p{Connector_Punctuation}].

Điểm mã chữ số theo định nghĩa chặt chẽ nhất là hậu quả và nhất thiết phải là [\p{Alphabetic}\p{Number}], thường được viết tắt là [\p{alpha}\pN].

+0

cảm ơn nhiều thông tin chi tiết. – raindrop

23

Bạn có thể thử một cái gì đó như:

[^_\W]+ 
+0

đơn giản nhưng rất hiệu quả, cảm ơn nhiều !! – raindrop

3

Giả sử các định danh phải bắt đầu bằng ký tự chữ, và sau đó có thể chứa bất kỳ số lượng alpha hoặc số, tôi sẽ làm điều này:

my $string = 'roger54a'; 
print "Match\n" if $string =~ m/\A\p{alpha}[\p{alpha}\p{Number}]*\z/; 

Đó neo để bắt đầu và kết thúc của chuỗi, loại trừ bất kỳ các ký tự không khớp với tập hợp alpha cụ thể theo sau bởi bất kỳ số lượng alpha và số nào.

Cập nhật: Tôi thấy tchrist vừa đưa ra giải thích tuyệt vời về các thuộc tính Unicode. Câu trả lời này cung cấp ngữ cảnh của một regexp đầy đủ.

Nếu bạn muốn 'alpha' dẫn đến có hai hoặc ba chữ số tiếp theo alpha-số, chỉ cần thêm lượng hóa thích hợp:

$string =~ m/\A\p{alpha}{2,3}[\p{alpha}\p{Number}]*\z/

Update2: Tôi thấy một định nghĩa mạnh hơn về những gì bạn' đang tìm kiếm trong một bình luận cho một trong những câu trả lời ở đây.Dưới đây là quan điểm của tôi về nó sau khi nhìn thấy rõ của bạn:

m/\Aroger[\p{alpha}\p{Number}]{2,3}\z/

+0

cảm ơn rất nhiều điều đó rất hữu ích – raindrop

2

giải pháp của bạn đề xuất:

(/^roger\w{2,3}[0-9a-z]/i) 

Phương tiện:

\w{2,3}-2 hoặc 3 chữ số, bao gồm _

[0-9a-z] (với/i) - một ký tự đơn có chữ và số, không bao gồm _

Tôi không thấy bất kỳ đề cập nào về 3 chữ số và chữ số được chấp nhận lúc đầu. Đó có thuộc về không?

Cả hai "roger54" và "roger4a" sẽ không thực hiện được điều này vì regex ở trên yêu cầu ít nhất ba ký tự sau "roger". Tương tự, "roger_ a" sẽ thành công vì "_" chuyển \ w {2,3} (cụ thể \ w {3}).

Yêu cầu của bạn nghe có vẻ như bạn muốn nhiều hơn của một trong những:

có nghĩa là, "roger" (case insensitive) tiếp theo là một hoặc nhiều (+) hoặc không có trở lên (*) chữ cái và/hoặc số.

+0

bạn giải quyết câu hỏi của mình, \ w {2,3} Tôi giả sử 2 hoặc 3 chữ số alpha sẽ là ok sau khi roger. giải pháp của bạn là ok nhưng tôi muốn cho phép chỉ có 2 hoặc 3 số alpha không nhiều hơn không ít hơn. cách tôi có thể giới hạn điều đó. như tôi đã nói mã của tôi làm việc tốt nhưng nó được cho phép (_) vì vậy tôi không muốn điều đó được cho phép. – raindrop

+0

ahh..Tôi có bạn ../^roger[0-9a-z]{2,3}/i work. cảm ơn bạn rất nhiều!! – raindrop

+0

Tôi đã bỏ lỡ phần chỉ có 2 hoặc 3 chữ và số sau "roger". Tôi rất vui vì bạn đã hiểu. Nhân tiện, tôi đã giả sử bạn đang làm Perl. Tôi không còn chắc chắn nữa, nhưng chắc chắn nó giống như Perl. –

0

Tôi đã cố gắng tìm một giải pháp cho điều này và giải pháp này đã không làm việc cho tôi trong C# khi cố gắng thực hiện thay thế regex. Trong trường hợp ai đó đang tìm kiếm:

c# Regex.Replace [^\w ] that also removes underscores?

Đây là những gì tôi sử dụng trong C#:

cleaned_string = Regex.Replace(input_string, @"[_]+|[^\w]+]", "");

Nếu bạn muốn giữ lại không gian:

cleaned_string = Regex.Replace(input_string, @"[_]+|[^\w\s]+", "");

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