도와 주세요.:루아 초보자용

Help

개요

LuaScribunto를 통해 몇 가지 상당한 제한이 있는 위키백과에서 구현된 프로그래밍 언어입니다.이 프로그램의 목적은 위키백과 콘텐츠 페이지에서 사용할 수 있는 데이터를 처리하여 다양한 종류의 맞춤형 정보 표시를 허용하는 것입니다.

가장 중요한 도움말 파일은 MediaWiki Scribunto Lua 참조 매뉴얼로, MediaWiki에 구현된 언어 및 표준 라이브러리 호출에 대한 간결한 요약을 제공합니다.

미디어가 아닌 일반적인 위키 루아 참조 매뉴얼은 매우 잘 작성되고 포괄적이며 정보를 제공하지만, 위키백과에서 특정 기능이 작동하지 않기 때문에 초보자에게 문제가 될 수 있습니다.print()이것은 표준 루아 "헬로 월드" 프로그램에 등장합니다.

현재 구현 관련 문제

가 없는 것 외에도print()기타 기능이 누락되었습니다. 전체 목록은 표준 Lua와의 차이점을 참조하십시오.

문자열 대신 mw.ustring 함수를 사용하는 것이 좋습니다. 문자열이 유니코드 문자와 함께 실패하는 경우가 있기 때문입니다.

입력

출력을 볼 때마다가 아니라 페이지가 "parse"된 경우(페이지 또는 페이지에 포함된 페이지가 변경 또는 미리 볼 때)에만 프로그램이 실행됩니다.따라서 입력 상자에 화씨 온도를 입력하고 버튼을 누를 때 해당 섭씨 온도를 반환하거나 페이지에서 Mandelbrot 세트 시각화의 세그먼트를 클릭하여 원하는 빈도로 확장할 수 있는 편리한 Lua 모듈은 없습니다.입력 데이터를 포함하는 실제 Wiki 페이지(또는 미리 보기 위해 제출한 페이지 이상)가 있어야 합니다.

그러나 mw.title.new와 같은 라이브러리 함수를 사용하여 Wiki의 텍스트 내용 페이지에서 내용을 가져올 수 있습니다.그러나 XML 텍스트 데이터가 포함된 .svg 파일은 물론 파일에서 데이터를 가져올 수 없습니다.

Lua 모듈 호출

Lua 호출은 템플릿과 매우 유사하며 다음과 같은 작은 텍스트 블록으로 구성됩니다.

{{#invoke:ConvertNumeric decToHex 73}}49를 주기

이 텍스트는 Lua 스크립트 자체를 호출하며, 이 스크립트는 Lua에 저장됩니다.Module: 네임스페이스입니다.이 통화의 효과는 정보를 전송하는 것입니다.#invokeLua 모듈에 대한 차단 및 브래킷 내의 모든 것을 반환으로 보내는 텍스트로 대체합니다. (말 그대로, "반환" 문에서)

이 경우 첫 번째 "매개변수"에 유의하십시오.decToHex는 실제로 Lua 모듈 내에서 호출되는 함수입니다.이 필드는 항상 다음 항목에 포함되어야 합니다.#invoke모듈에 익숙하지 않은 사람들, 특히 이후에 무엇이든 기대하는 위키피디아 템플릿 코더들에게. 매개 변수가 되기 위해서는 특히 모듈의 모든 사용이 모듈의 존재에 의존하는 경우 이 추가 필드의 필요성이 놀랍습니다.작업을 문서화할 때 다음과 같은 명시적인 사용 지침을 포함하는 것이 유용합니다.{{mlx ConvertNumeric decToHex 73}}그들이 그것을 빠뜨리지 않도록 이해하도록.

많은 기존 모듈의 경우, 예#invoke스크립트의 (그리고 다른 것은 거의) 제공되지 않습니다.Module talk:페이지. 작성자가 변경사항의 효과를 보기 위해 대화 탭으로 빠르게 이동할 수 있는 것은 편리하지만, 대화 페이지를 템플릿으로 사용해서는 안 됩니다. 사람들이 실제로 대화를 할 수도 있기 때문입니다!또는 모듈 페이지는 별도의 /doc 페이지(모듈:위키데이터IB가 있음).

다른 예:LuaCall을 사용하여 단일 Lua 명령 수행

초보자로서 또는 일상적인 토크 페이지 대화에서 Lua를 사용하고 싶지만 전체 모듈을 작성하고 싶지 않은 계산이 하나 있을 수 있습니다.모듈을 찾을 수 있습니다.LuaCall은 이것에 편리합니다.예를 들어, 탐욕스러운 루아 패턴의 작동 방식을 테스트할 수 있습니다.

  • {{#invoke:LuaCall main a=bbbbbbbbbba b=bb(.*)b(.+)bba string.match(a,b)}}bbbb

또는 Did you know 후크 길이 또는 Did you know 후보의 텍스트 부분을 카운트합니다.

  • {{#invoke:LuaCall main a=... that you can count the length of your DYK hook with a Lua module? string.len(a)}}69

그러나 이러한 구체적인 예에서 모듈:문자열은 이 두 가지 작업을 모두 수행할 수 있습니다.

모듈의 스크립트:명명된 매개 변수 집합을 수락하도록 LuaCall이 작성되었습니다.somename=value문자열을 저장하는 각각의 경우.value변수에 이름을 입력한 다음 이러한 변수를 Lua에서 사용할 수 있는 함수에 대한 매개 변수로 사용할 수 있습니다.그런 다음 스크립트는 함수에 의해 반환된 첫 번째 값만 반환합니다(Lua 함수는 여러 값을 반환할 수 있지만, 이 경우 모듈에서 첫 번째 값만 반환됩니다).

오류

Lua 오류는 빨간색 "스크립트 오류" 메시지로 나타납니다.Javascript가 활성화된 경우 빨간색 스크립트 오류 메시지는 일반적으로 모듈에서 오류가 발생한 줄로 다시 따라갈 수 있는 링크입니다.모듈 이름 자체가 잘못 입력된 경우 "Module not found(모듈을 찾을 수 없음)" 또는 지정된 함수 이름이 잘못된 경우 "지정한 함수가 존재하지 않았습니다"와 같은 몇 가지 예외가 있습니다.

Lua 프로그램 구조:출력

Wikipedia Lua 프로그램의 가장 근본적인 부분은 출력물을 가지고 있던 페이지로 되돌리는 반환문입니다.#invoke반환문이 없어도 오류 없이 실행되는 루아 함수를 가질 수 있지만, 일반적으로 루아 프로그램이 위키백과에 부작용을 줄 수 없기 때문에 위키백과에서는 의미가 없습니다.

모듈 자체가 Lua 테이블 값을 반환해야 합니다.Lua 테이블은 쉼표로 구분된 값 목록으로, 중괄호 안에서 표시됩니다.모듈이 에 의해 호출될 때#invoke이름을 지정하는 함수( 뒤의 첫 번째 인수)를 해당 테이블에서 찾습니다.그 함수는 차례로 문자열로 표현될 수 있는 것을 반환할 것으로 예상됩니다.

그러므로,return { mw.ustring.gmatch( "Hello world", "(.*)" ) }는 실제로 완전한 Lua 모듈(매우 이상한 모듈이지만)입니다. mw.ustring.gmatch(위에서 언급한 Lua 참조에 나열된 반복기 함수)가 반환하는 함수를 배열의 유일한 요소(내부에 표시됨)로 반환합니다.{})—을(를) 사용하여 실행할 경우{{#invoke:ModuleName 1}}"Hello world" 문자열을 생성합니다.하지만, 일은 보통 이런 식으로 진행되지 않습니다.일반적으로 전체 형식을 사용합니다.

현지의 p = {} 변수 p를 빈 테이블로 정의하지만 *not* nil은 아닙니다.  기능. p.주된(  ) 이 블록은 테이블 요소 p["main"]를 함수로 정의합니다.     돌아가다 "안녕 세상" 함수의 문자열 결과입니다. 끝. 함수 객체 p["main"](또는 p.main)을 정의하는 블록을 종료합니다.  돌아가다 p 이것은 표 p를 반환합니다. 표 p는 "주" 키 아래에 다음을 포함합니다.     (p.main) 위의 함수로, 호출 시 "Hello world" 문자열을 반환합니다. 

참고:function p.main(frame) ... end와 동등합니다.p.main = function(frame) ... end또는p["main"] = function(frame) ... end함수는 키를 사용하여 검색되는 또 다른 유형의 값일 뿐입니다."main"테이블에서p사용자가 다음을 사용하여 동일한 모듈을 호출할 경우{{#invoke:module-name hello}}대신에{{#invoke:module-name main}}당신은 쓸 수 있습니다.p.hello = p.main이 함수에 대한 참조를 표의 새 키로 복사합니다.당신은 심지어 쓸 수도 있습니다.p[""] = p.main그 원인은{{#invoke:module-name }}와 동일한 결과물을 생산하기 위해{{#invoke:module-name main}}기능을 데이터 유형으로 생각하는 것을 배우는 것은 나중에 다음과 같은 라이브러리 기능으로 작업하기 위해 매우 중요해집니다.mw.ustring.gsub반복기 기능을 구성합니다.

Lua 프로그램 구조:입력

위의 매개 변수(위키백과 Lua 모듈에서 거의 항상 이 이름이 지정됨)는 Lua 모듈로 호출하는 페이지에서 전달되는 다른 테이블을 수신합니다.그것은 놀라운 양의 것들을 포함하고 있는데, 그 중 몇 가지는 초보자와 관련이 있습니다.

인수

frame.args다른 테이블, 즉 사용자가 보낸 모든 콘텐츠를 포함합니다.#invoke실행할 함수의 이름을 나타내는 첫 번째 인수를 제외한 대괄호를 사용합니다.소인{{#invoke:ConvertNumeric decToHex 3377}}현악기"3377"의 내용입니다.frame.args[1](와 동일)frame["args"][1]하지만 와 같지는 않습니다.frame.args["1"]또는frame["args"]["1"]. 이름 없는 매개 변수는 숫자를 키로 사용하여 나옵니다(frame.args[1],frame.args[2]등), 명명된 매개 변수는 매개 변수 이름(키)을 키로 사용하여 표시됩니다.frame.args["count"],frame.args["style"]등).

예:

{{#invoke:modulename functionname 3377 4 count=3 style=bold}}

의 결과.

frame.args[1]=3377,frame.args[2]=4,frame.args["count"]=3,frame.args["style"]="bold".

상위 프레임

이내에frame스크립트를 제공하는 페이지를 호출한 페이지를 참조하는 상위 프레임이 있으며, 이 프레임에서 인수를 꺼낼 수도 있습니다.그냥 쓰기

parent=frame.getParent(frame)

그리고.parent.args에는 이러한 인수가 포함됩니다.

루아에서는 동의어를 사용하는 것이 인기가 있습니다.parent=frame:getParent()쓰기의 필요성을 취소하기frame두 번. 대장을 기록합니다.:점 대신 ( ).).parent=frame:getParent()와 정확히 같은 의미입니다.parent=frame.getParent(frame)초보자들에게는 이것이 혼란스러울 수 있으며, 이 관용구를 아는 것이 중요합니다.만약 당신이 그것을 잘못된 방법으로 사용한다면, 스크립트 오류는 이것이 실수였다고 지적하는 것에 꽤 능숙합니다.

기본 디버깅

디버깅은 프로그램을 작성하는 즉시 시작할 수 있으며 문자열 연결로 간단히 수행할 수 있습니다.주요 함수(p.main)에서 "debuglog"와 같은 인식 가능한 이름을 가진 변수를 다음과 같은 문장으로 설정하면 됩니다.local debuglog=""이 초기 "" 정의는 0이 되고 문자열을 0으로 연결하면 오류가 발생하기 때문에 도움이 됩니다.이제 테스트할 변수가 있을 때마다 x라고 말하면 됩니다.debuglog = debuglog .. "x=" .. tostring(x)그리고 당신의 프로그램의 끝에 있습니다. return output .. debuglog"tostring"은 x를 문자열로 해석하여 테이블, nil 등일 경우 Script 오류가 아닌 "table", "nil" 등으로 표시되도록 하는 함수입니다.

포맷

WP:Lua 스타일 가이드는 4개의 공백 들여쓰기를 사용하고 동일한 들여쓰기 수준에서 끝나는 경우 유지하는 것과 같은 JavaScript 모듈 편집기에서 예상되는 몇 가지 기본적인 형식 지정 제안을 제공합니다.

줄 끝에 대한 주석은 --로 표시됩니다. 주석을 사용합니다.위키백과의 많은 모듈들은 직선적인 디자인을 가지고 있습니다. 하지만 그것은 여러분이 100번째 코드로 돌아갈 때 여러분의 섹션에 명확한 라벨을 붙이는 것이 도움이 되지 않는다는 것을 의미하지 않습니다.Lua 스타일 가이드에서는 작업을 보다 체계적으로 유지하기 위한 기능 사용에 대한 추가 권장 사항을 제공합니다.

역겨운 벌레들

주의해야 할 몇 가지 버그:

  • 문자열 값을 호출하려고 합니다.연결 중인 항목의 어딘가에서 문자열과 변수 사이의 ...를 잊어버렸다는 뜻입니다.
  • 변수는 변수에 항목을 할당하려는 모든 작업을 무시합니다.실수로 두 개의 로컬 문을 작성했을 수 있습니다. 하나는 제한된 영역 내에서 변수 값을 설정하고, 프로그램이 해당 영역을 벗어나면 이전 값으로 돌아갑니다.
  • 번호가 매겨진 테이블 항목은 할당하려는 모든 작업을 무시합니다.이것은 a["50"이 a[50]이 아니기 때문입니다.일반적으로 한 곳에서 문자열 함수를 사용하여 매개 변수(호출에서 문자열로 수신했을 수 있음)를 처리했지만 다른 곳에서는 숫자 연산을 수행하여 인덱스에 사용할 두 가지 다른 유형의 변수가 남게 됩니다.
  • 표시하려는 일부 그래픽이 언덕으로 이동하고 있습니다.(실제로 HTML 오류) 당신은 당신의 </div>s를 닫지 않았기 때문에, 모든 위:와 왼쪽: 스타일이 계속해서 합산됩니다.
  • 영...0 변수에 대해 할 수 없는 모든 종류의 것들이 있습니다. 할당과 같은 것들입니다.x.somefield또는 x[n] ifx0, 연결됨a .. ba 또는 b가 0이면 a[x]를 평가합니다.(로컬) x={}, a=dll 등을 사용하여 이러한 변수를 초기화합니다.종종 이러한 오류에서 "글로벌"이 언급됩니다. 왜냐하면 당신은 그것을 가지고 있지 않았기 때문입니다.localnil 변수에 대한 문입니다.
  • 문자열이 필요하며 함수를 받았습니다.mw.ustring.gmatch와 같은 일부 중요한 항목은 실제로 문자열이 아닌 함수를 반환합니다. 아래 함수를 참조하십시오.
  • 해당 모듈이 없습니다.#존재하지 않는 모듈을 호출했거나 #invoke:#invoke:x 대신 모듈:x.
  • 지정한 함수가 없습니다.# 모듈을 호출했지만 모듈 이름 뒤의 필드가 잘못되었습니다.종종 이 필드는 "main"과 같은 표준 이름을 예상하며, 이 이름을 잊어버리고 첫 번째 데이터 매개 변수로 바로 이동합니다.함수 이름이 확실하지 않으면 모듈 설명서를 확인하거나 코드에서 "프레임" 매개 변수를 허용하는 함수를 찾습니다.

표 및 관련 개념 이해

  • 목록은 쉼표로 구분된 값 집합입니다.값은 문자열, 숫자, 테이블, 함수 등이 될 수 있습니다.
  • 시퀀스는 1부터 N까지의 인덱스를 가진 항목 집합입니다. 여기서 N은 양의 정수입니다.식 목록 주위에 괄호를 배치하여 만들 수 있습니다.예를 들어, 만약a={1, "quotation", mw.ustring.gmatch("abca","a"), {2,3,4}}그리고나서a[1]=1,a[2]="비공식",a[3]에서 반환된 함수입니다.gmatch(),그리고.a[4]테이블입니다.{2,3,4}다음을 사용하여 테이블에서 식 목록을 복구할 수도 있습니다.unpack():b, c, d = unpack(a)설정할 것b=1,c="부드러운", 그리고d의 기능이 회복된 대로gmatch();{2,3,4}이 경우 삭제됩니다.
  • 테이블은 시퀀스이며, 선택적으로 명명된 키로 보완됩니다.digit["two"]="2"다음과 같은 여러 테이블 함수table.concat에서는 번호가 매겨진 값에서만 작동하고 명명된 키는 무시합니다.
  • 메타테이블은 테이블 동작을 변경하기 위한 대규모의 선택적 메소드 집합을 제공합니다.예를 들어 함수처럼 호출할 수 있는 테이블을 정의할 수 있습니다.

테이블 초기화

문에서 한 번에 전체 테이블을 만드는 것이 종종 유용합니다.이를 위해 여러 가지 동일한 방법이 있지만 바로 가기가 모든 종류의 값에 적용되는 것은 아닙니다.우선 가장 일반적인 방법은 각 키와 값을 명시적으로 할당하는 것입니다.

a = {[0]='zero', [1]='one', ['1']='string for one'}

시퀀스 키(양의 정수)가 순서대로 주어지면 값만 주어지면 되므로 다음과 같이 할당됩니다.'one'로.a[1]:

a = {[0]='zero', 'one', ['1']='string for one'}

키에 문자, 숫자 및 밑줄만 있고 숫자가 아닌 문자로 시작하는 경우 대괄호와 따옴표를 생략할 수 있습니다.

a = {a='one', b='two'}

이는 다음과 같습니다.a = {["a"]='one', ["b"]='two'}.

그러나 숫자로 시작하는 키의 경우에는 실패합니다.hex = {7f = 127}오류가 발생합니다. 사용hex = {['7f'] = 127}대신.

괄호 안에 넣거나 등호 오른쪽에 붙이면 따옴표가 필요합니다. 그렇지 않으면 문자열 값이 변수로 사용됩니다.

a = {[b] = c}

변수 b에 포함된 키변수 c의 값을 할당합니다.

함수

  • 함수는 함수를 포함하여 모든 종류의 값을 반환할 수 있습니다.이것은 초보자를 쉽게 혼동할 수 있는 강력한 기능입니다.설정하는 경우a=mw.ustring.gmatch(text, "(.)")에 부여된 결과.a문자열 문자가 아닌 함수가 됩니다!단, 할당 중b=a()저장된 함수를 호출하여a첫 번째 일치 항목(문자열)을 반환합니다.설정할 때마다b=a()그 후에 당신은 또 다른 성냥(끈)을 얻을 것입니다.b당신이 성냥이 다 떨어져서 얻을 때까지.nil많은 반복기 기능이 이러한 방식으로 작동합니다.
  • 다른 변수를 사용하여 반복기 함수에 대한 개별 카운트를 유지할 수 있습니다.예를 들어, 다음을 설정할 경우q=mw.ustring.gmatch(text, "(x.)")동일한 모듈에서 동일한 텍스트의 문자를 가져올 수 있습니다.text)을 평가함으로써d=q()에서 설 자리를 잃지 않고a().
  • 테일 콜은 언어를 마스터하는 사람들에게 성능 면에서 상당한 이점을 제공합니다.
  • 함수 이름은 종종 "p.myFunctionName" 형식입니다. 여기서 p는 프로그램 하단의 "return p"에 있는 표입니다.그 이유는 원래 #invoke 문에서 이 테이블의 항목인 함수에만 액세스할 수 있기 때문입니다.프로그램 내에서 로컬로 사용할 수 있는 기능에는 임의의 이름을 사용할 수 있습니다.

패턴 이해

참고: Lua 패턴은 전통적인 POSIX 의미에서 정규 표현식이 아니며 정규 표현식의 하위 집합도 아닙니다.그러나 정규 표현식(아래에 더 있음)과 많은 구조를 공유합니다.

루아 패턴은 문자열에서 패턴을 정의하고, 찾고, 처리하는 데 사용됩니다.일반 검색을 수행하고 텍스트의 작업을 대체할 수 있지만 일반 텍스트만 수행하는 것보다 더 많은 옵션이 있습니다.예를 들어, 'New Yorker', 'New Yorker' 및 'New Yorker' 오류를 'New Yorker'로 한 번에 변경할 수 있습니다.

  • 우선 패턴은 특수 문자 ^ () $ () % . [] * + - ?를 포함하지 않는 한 일반 문자열처럼 작동합니다.
  • 대괄호 [ ]는 선택 목록에서 문자열의 단일 문자를 일치시키는 데 사용됩니다.[syslog]는 a, b 또는 c 문자와 일치합니다.^ 바로 뒤에 [표시는 "표시는 있지만": [^tx] = a, b 또는 c가 아닙니다.괄호 안에 있고 첫 번째 문자가 아닌 경우 -는 범위를 나타냅니다. [a-z]는 a, b, c, …, z의 단일 문자와 일치합니다.
  • 마침표는 모든 문자와 일치합니다.
  • 백분율 %는 문자 뒤에 일치할 수 있는 문자 집합(클래스)이 크다는 것을 나타냅니다.전체 목록은 [1]을 참조하십시오.구두점 뒤에 특수 문자가 있으면(위의 특수 문자이든 아니든) %가 제거되고 구두점이 리터럴 문자(%% = 리터럴 %)로 사용됩니다.특수 클래스에는 균형 잡힌 클래스 %bxy 및 %f[set]가 포함됩니다. 자세한 내용은 위 링크를 참조하십시오.
  • 괄호( )는 캡처를 나타냅니다.캡처는 나중에 검색 문자열이나 string.gsub 대체 문자열에서 %1에서 %9까지 액세스할 수 있으며 string.match에 의해 결과의 식 목록으로 반환됩니다.
  • 한정자 ? - * +는 단일 문자(긴 문자열이 아님)의 반복을 지정합니다.
  • 0 또는 1회 반복을 의미합니다. "a?"는 "a" 또는 ""와 일치합니다.
  • 0회 이상의 반복을 의미하며, 일치하는 항목("비반복")을 가능한 한 적게 선택합니다.예를 들어 string.match("bbbb", "-)"는 ""을 생성하는데, 이는 식의 끝을 루트화하고 0자와 일치하지 않도록 방지하는 것이 없기 때문에 유용하지 않습니다.
  • 0회 이상의 반복을 의미하며, 가능한 한 많이 선택합니다("반복").예를 들어 string.match("bbb", ".*)"는 bbbb를 산출합니다.
  • 하나 이상의 반복을 의미하며, 가능한 한 많이 선택합니다("반복").

선택 사항이 있을 때 가장 왼쪽에 있는 한정자 규칙의 탐욕스러움: "bbb"에 일치하면 "bb", ""," "abba"에 일치하면 ".b(.)a"가 "bb"를 반환합니다.

  • 그리고 $는 문자열이 패턴의 적절한 위치에서 발생하는 경우 문자열의 시작과 끝을 나타냅니다.그렇지 않으면 문자 그대로의 문자입니다.는 string.gmatch 함수에서 사용되지 않습니다.

Lua 패턴에 대한 참조 설명서는 mediawiki.org 에 있습니다.

Lua 패턴 대 정규 표현식 참고

Lua 패턴은 정규식(때로는 정규식 또는 정규식으로 단축)을 기반으로 합니다.루아 패턴은 의도적으로 다른 많은 컴퓨터 언어나 라이브러리가 더 완전한 집합을 사용하는 가장 복잡한 정규 표현 구조(루아 코드 베이스의 부풀림을 방지하기 위해)가 부족합니다.루아 패턴은 탈출 문자를 사용하는 루아와 같은 불일치도 있기 때문에 정규 표현의 하위 집합이 아닙니다.%대신에\,루아가 제공하는 것과 같은 추가 사항.-의 일반적인 버전으로서*.

다음은 정규 표현식에 비해 루아 패턴이 부족한 몇 가지 사항을 나열한 것입니다.

  • 단일 문자가 아닌 다른 문자 간의 대체를 검색할 수 없습니다.(his her)둘 중 하나를 선택하다his그리고.her라고 밖에 할 수 없습니다.[abc]단일 문자 중 하나를 선택하다a,b또는c).
  • 다음과 같은 다중 문자 구조의 다중을 찾을 수 없습니다.(choo-)*choo어울리게choo,choo-choo또는choo-choo-choo루아 패턴으로는 이를 수행할 수 없습니다.
  • 다음과 같이 최소 및 최대 반복 횟수를 지정할 수 없습니다.[0-9]{3,5}(3~5자리 일치); 당신은 루아어로 말할 것입니다.%d%d%d%d?%d?대신에 이 경우에는.

정규 표현식을 포함하여 더 강력한 [2]옵션을 제공하는 Lua 라이브러리가 있지만, 위키백과에 대한 지원은 매우 기본적입니다.

정규 표현식에 대한 위키백과 도움말(루아가 언급했듯이 지원하지 않음)은 위키백과에 있습니다.AutoWikiBrowser/정규식입니다.