2010-06-28 25 views
6

Tôi rất mới với RegEx - vì vậy ai đó có thể vui lòng giúp tôi tìm ra chính xác những gì đang xảy ra ở đây?RegEx - Định lượng {x, y} sau không có lỗi nào

tôi có mã này:

 string regPattern = "*[~#%&*{}/<>?|\"-]+*"; 
     string replacement = ""; 
     Regex regExPattern = new Regex(regPattern); 

Tuy nhiên, khi ứng dụng của tôi hits dòng regExPattern, tôi nhận được một ArgumentException - quantifier {x, y} sau lỗi gì cả.

Ai đó có thể trợ giúp?

EDIT: Tôi cần phải vượt qua mô hình này vào một vòng lặp foreach như sau:

if (paths.Contains(regPattern)) 
     { 
      foreach (string files2 in paths) 
      { 
       try 
       { 
        string filenameOnly = Path.GetFileName(files2); 
        string pathOnly = Path.GetDirectoryName(files2); 
        string sanitizedFileName = regExPattern.Replace(filenameOnly, replacement); 
        string sanitized = Path.Combine(pathOnly, sanitizedFileName); 
        //write to streamwriter 
        System.IO.File.Move(files2, sanitized); 

       } 
       catch (Exception ex) 
       { 
        //write to streamwriter 

       } 
      } 
     } 
     else 
     { 
     //write to streamwriter 

     } 

Làm thế nào để tôi xác định mô hình nếu nó đang được truyền vào vòng này?

+0

Để cụ thể - mẫu tôi có trong mã có nghĩa là loại bỏ các ký tự không hợp lệ đó trong tên tệp. do đó tôi cần phải loại bỏ dấu sao, dấu ngã, dấu thăng, dấu ngoặc đơn, dấu ngoặc nhọn, v.v. đây có phải là mẫu chính xác không? – yeahumok

Trả lời

6

Cập nhật: sau khi đọc bình luận cho câu hỏi Tôi nghĩ rằng bạn muốn đơn giản này:

s = Regex.Replace(s, "[~#%&*{}/<>?|\"-]+", ""); 

Cũ câu trả lời: Tôi đoán khi bạn viết * bạn đang nghĩ đến ký tự đại diện như những người bạn sẽ nhập tại một shell:

* .txt

Đây không phải là cách * công trình trong cú pháp biểu thức chính quy. Những gì bạn có thể muốn thay vào đó là .*:

".*[~#%&*{}/<>?|\"-]+.*" 

Các . có nghĩa là "bất kỳ ký tự" và * có nghĩa là "zero hoặc nhiều trước".

Bên trong lớp nhân vật [...]* mất ý nghĩa đặc biệt của nó và trở thành ký tự chữ nên không cần phải thoát. Thoát nó không cần thiết bên trong lớp nhân vật sẽ không gây hại gì và một số người thấy dễ đọc hơn.

+0

* có nghĩa là dấu hoa thị - không phải bất kỳ ký tự nào. Tôi vẫn cần phải gạch chéo nó? – yeahumok

+0

Ý nghĩa của '*' thay đổi tùy thuộc vào việc nó nằm trong lớp nhân vật hay không. Bên trong một lớp nhân vật, nó có nghĩa là một chữ '*' cho dù nó có được thoát hay không. Bên ngoài một lớp nhân vật, nó có nghĩa là "không hoặc nhiều hơn" nếu không thoát và '*' theo nghĩa đen nếu được thoát. –

+0

+1 (để sửa đổi), và trong C# bạn nên sử dụng các chuỗi nguyên văn cho các regex.Họ không sử dụng dấu gạch chéo ngược làm ký tự thoát; bạn chỉ phải thoát dấu ngoặc kép bằng dấu ngoặc kép khác: '@" [~ #% & * {}/<>? | "" -] + "' –

1

* là công cụ định lượng có nghĩa là "không hoặc nhiều lần" (giống như {0,}). Bạn sẽ phải thoát khỏi nó bằng cách sử dụng dấu chéo ngược như thế này: \*

0

Kể từ khi bạn đang làm một Regex.Replace để thay thế bất kỳ trong số này một nhân vật phù hợp với một chuỗi rỗng:

 string pattern = "[~#%&*{}/()<>?|\"\\\\-^[\\]]"; 

     string input = @"(*&af%\#$}afd]a#f%hjg{d(^(^[RF*()^FR(7r5"; 

     string output = Regex.Replace(input, pattern, String.Empty); 
0

Thêm . trước số *

ví dụ string regPattern = ".*[~#%&*{}/<>?|\"-]+.*";

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