CamelCase2snake_case ()


13

Viết hàm để chuyển đổi văn bản CamelCase thành sn_case: FunctionForHTMLManipulationtrở thànhfunction_for_html_manipulation

Văn bản đầu vào sẽ là một định danh phù hợp duy nhất trong nhiều ngôn ngữ. Nó phải bắt đầu bằng một chữ cái tiếng Anh, sau đó được theo sau bởi bất kỳ số lượng chữ cái hoặc chữ số tiếng Anh. Không cho phép các ký tự khác (dấu cách, ký hiệu, v.v.).

Mỗi "từ" trong văn bản CamelCase sẽ bắt đầu bằng chữ in hoa trừ khi ở đầu văn bản hoặc ngay sau một chữ số và được theo sau bằng 0 hoặc nhiều chữ cái, tất cả đều giống nhau. Các nhóm chữ số sẽ được coi là các từ riêng biệt nhưng chuyển qua không thay đổi.

Nói cách khác, một chữ cái viết thường theo sau là một chữ cái viết hoa cho biết một từ ngắt. Bất kỳ chữ cái và chữ số cạnh nhau cho thấy một từ nghỉ. Một chữ cái viết hoa theo sau là một chữ cái viết hoa khác và một chữ cái viết thường cho biết một từ ngắt.

...lU...=> ...l_u...
...l9...=> ...l_9...
...U9...=> ...u_9...
...9l...=> ...9_l...
...9U...=> ...9_u...
...UUl...=>...u_ul...

Cả hai Buy24Beersbuy24beerstrở thành buy_24_beers.
MacDonaldAndObriantrở thành mac_donald_and_obrian.
MACDonaldAndOBriantrở thành mac_donald_and_o_brian.


6
" MACDonaldAndOBriantrở thành mac_donald_and_o_brian" - tại sao?
Qwertiy

2
@Qwertiy Vì tôi nghĩ những cái tên đó sẽ rất vui. Trừ khi bạn hỏi về quy tắc, được bao phủ bởi ...UUl...=> ...u_ul....
CJ Dennis


@DigitalTrauma Gần như tuyệt vời với câu hỏi ban đầu của tôi nhưng không có khiếu nại về việc hai câu hỏi trong một và không có câu trả lời! Sự khác biệt lớn nhất là trong việc xử lý chuỗi ALLCAPS. Tôi đã tìm kiếm để xem nếu câu hỏi đã được hỏi trước đó nhưng tôi không tìm thấy nó.
CJ Dennis

1
@ggorlen ...chỉ ra nó ở giữa một chuỗi.
CJ Dennis

Câu trả lời:


7

Võng mạc , 61 37 byte

r1>`[A-Z]?[a-z]+|[A-Z]+|\d+
_$&
T`L`l

Hãy thử trực tuyến! (Sửa đổi một chút để chạy bộ thử nghiệm đầy đủ.)

Giải trình

Thay vì tìm ranh giới từ để chèn dấu gạch dưới, chúng tôi chỉ cần khớp từng từ và thêm vào a _. Ghép các từ từ bên trái là một chút khó chịu vì UUlquy tắc, nhưng bằng cách sử dụng kết hợp từ phải sang trái của .NET, chúng ta có thể dễ dàng kết hợp các từ một cách tham lam. Để tránh dẫn đầu _, chúng tôi sử dụng các giới hạn của Retina.

r1>`[A-Z]?[a-z]+|[A-Z]+|\d+
_$&

Việc rkích hoạt chế độ từ phải sang trái, 1>yêu cầu Retina xử lý mọi thứ trừ trận đấu đầu tiên (đếm từ trái sang phải). Sau đó có bốn loại "chữ": Ulll, lll, UUU, ddd. Đây là dễ dàng phù hợp với các mẫu nhất định. Sự thay thế chỉ viết một _tiếp theo bởi chính từ đó.

T`L`l

Điều này chỉ đơn giản biến chữ hoa thành chữ thường để hoàn thành việc chuyển đổi.


6

JavaScript (ES6), 79 byte

s=>s.match(/[A-Z]+(?=[A-Z][a-z]|\d|$)|[A-Z]?[a-z]+|\d+/g).join`_`.toLowerCase()

3

JavaScript (ES6), 89 byte

s=>s.replace(/\d(?=\D)|\D(?=\d)|[a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z])/g,"$&_").toL‌​owerCase()

2

Powershell, 77 byte

Dựa trên câu trả lời của Neil .

$args-creplace'\d(?=\D)|\D(?=\d)|[a-z](?=[A-Z])|.(?=[A-Z][a-z])','$&_'|% *wer

Kịch bản kiểm tra ít chơi gôn hơn:

$f = {

$args-creplace'\d(?=\D)|\D(?=\d)|[a-z](?=[A-Z])|.(?=[A-Z][a-z])','$&_'|% toLower

}

@(
    ,("Buy24Beers", "buy_24_beers")
    ,("buy24beers", "buy_24_beers")
    ,("MacDonaldAndObrian", "mac_donald_and_obrian")
    ,("MACDonaldAndOBrian", "mac_donald_and_o_brian")
    ,("BigD", "big_d")
) | % {
    $s,$expected = $_
    $result = &$f $s
    "$($result-ceq$expected): $result"
}

Đầu ra:

True: buy_24_beers
True: buy_24_beers
True: mac_donald_and_obrian
True: mac_donald_and_o_brian
True: big_d


1

PowerShell, 68 92 byte

Đã xóa nhanh, +24 byte khi sử dụng RegEx sai.

($args-creplace'\d(?=\D)|\D(?=\d)|[a-z](?=[A-Z])|.(?=[A-Z][a-z])','$&_').Trim('_').ToLower()

Hãy thử trực tuyến!

Về cơ bản giống như các giải pháp JavaScript.


Nó không hoạt động với buy24beersMACDonaldAndOBrian. Lấy làm tiếc.
mê mẩn

1
@mazzy đã sửa, cảm ơn.
Gabriel Mills

0

Yếu tố, 140 byte

[ R/ [a-z][A-Z][a-z]/ [ dup from>> swap dup to>> swap seq>> subseq R/ [A-Z][a-z]/ [ "_" prepend ] re-replace-with ] re-replace-with >lower ]

Ung dung:

: slice>subseq ( slice -- subseq )
dup from>> swap dup to>> swap seq>> subseq ;

: camel-case>snake-case ( string -- string' )
    R/ [a-z][A-Z][a-z]/ [
        slice>subseq R/ [A-Z][a-z]/
        [ "_" prepend ] re-replace-with
    ] re-replace-with >lower ;

0

Lua , 135 byte

function snake(s)return s:gsub('%f[^%l]%u','_%1'):gsub('%f[^%a]%d','_%1'):gsub('%f[^%d]%a','_%1'):gsub('(%u)(%u%l)','%1_%2'):lower()end

Hãy thử trực tuyến!

Giải pháp này được hưởng lợi từ ký hiệu viết tắt của Lua cho các lớp ký tự của C (chữ thường %l, chữ hoa %u, chữ cái %a, chữ số %d), ký hiệu biên giới ( %f[]) và từ toàn bộ trận đấu được thêm vào dưới dạng bắt đầu đầu tiên trong trường hợp không có bất kỳ hình chụp nào khác.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.