2012-04-01 28 views
6

Tôi đang viết trình giả lập cho một máy có mã vạch 'printf' và trong khi tôi biết lớp Formatter có thể đủ tốt để định dạng chuỗi, tôi cần một cách để đếm số đối số được tiêu thụ bởi cuộc gọi printf.Có thư viện Java nào để phân tích chuỗi định dạng printf không?

Tắt đầu, tôi có thể làm điều gì đó với một regex để đếm số '%', nhưng tôi không quá quen thuộc với chuỗi định dạng, vì vậy tôi có thể không đếm đúng ... (trừ những người đã thoát, vv)

chỉnh sửa: Tôi thực sự cần số tham số, cùng với ánh xạ tham số # đến loại tham số, ví dụ: "hello% s% +. 3i" sẽ cho {0 - > string, 1 -> Integer}

+1

bạn đang tìm kiếm thứ gì đó phân tích cú pháp chuỗi định dạng hợp lệ cho lớp Trình định dạng hay các chuỗi định dạng hợp lệ cho C printf? (ví dụ: hỗ trợ '% * s' hoặc'% *. * f' chuỗi nhận 2 hoặc 3 đối số, vì vậy bạn không thể chỉ đếm số% s) –

+1

các loại đối số duy nhất áp dụng trong trường hợp của tôi là ký tự , Số nguyên được ký 32 bit, số tăng gấp đôi 64 bit và chuỗi bị hủy null. Nếu không nó sẽ hoạt động như c printf, vì vậy tôi đoán Formatter là không chính xác, nhưng nó có lẽ sẽ làm việc cho mục đích của tôi, như đầu vào là đến từ một trình biên dịch tôi đã viết anyway. – Bwmat

+0

Hmm. Nếu bạn đã viết một trình biên dịch, bạn không thể viết một trình phân tích ngữ pháp đơn giản (tương đối) cho bất kỳ biến thể 'printf()' nào bạn muốn hỗ trợ, và sử dụng cây cú pháp trừu tượng để tạo số đối số? nhiều công việc hơn là một cuộc gọi thư viện đơn giản, nhưng nếu bạn có các công cụ như ANTLR hoặc bất cứ điều gì để làm phân tích cú pháp, tôi nghĩ nó sẽ không khó, và bạn có thể đảm bảo chương trình của bạn hoạt động chính xác. Lý do duy nhất tôi đưa ra điều này là phân tích cú pháp printf đầy đủ không phải là dễ dàng như vậy. Nếu bạn có thể sống mà không có cú pháp chiều rộng biến, đơn giản hóa nó một chút, và bạn có thể làm điều đó với Regex –

Trả lời

1

Tại sao bạn không chỉ sử dụng Regex giống như %(?:%|[0-9]+([dox])) và kiểm tra trình định dạng loại định dạng theo cách đó?

Có một chủ đề SO khác về parsing sprintf format strings with regex's có thể cung cấp cho bạn một số ý tưởng khác. Trừ khi bạn chỉ định các tính năng của printf() mà bạn muốn, thật khó để đề xuất một regex chính xác.

Hoặc, như tôi đã đề cập trong nhận xét của tôi, nếu bạn đang sử dụng một công cụ trình biên dịch khác như ANTLR hoặc Parboiled, hãy sử dụng công cụ đó để giải mã chuỗi định dạng thành các phần thích hợp thông qua một đặc tả ngữ pháp đơn giản.

7

Format Strings giải thích mỗi % như một giữ chỗ, với nghĩa đen % được thoát như %%, vì vậy nó nên càng đơn giản như thế này:

String formatString; 
int parameterCount = formatString.replace("%%", "").split("%").length - 1; 

Trước tiên, mã này sẽ xóa tất cả thoát (gấp đôi) %, sau đó đếm số % thông qua chia tách.

+0

+1 Cho 'đếm% thông qua chia'. –

+0

thực sự, bây giờ tôi nghĩ về nó, tôi thực sự cần một ánh xạ tham số # -> kiểu tham số, ugh. – Bwmat

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