나는 D를 배우려고 노력하고 있지만, 문서가 부족하거나 (그것을 이해하고있다) 어려움을 겪고 있으므로 여기에 왔습니다. 나는 이미 오늘과는 다른, 그러나 무관계 한 질문을했다.D 문자열을 파싱하기 D
어쨌든, 여기 간다 :
내가 다른 것들에 대한 문자열을 구문 분석하고 싶습니다. 더 라벨이없는 경우 필수 공백이,
[<label>] <mnemonic> [parameters]
:
문자열 형식은 같은 것입니다. 매개 변수는 쉼표로 분리 할 수 있습니다. 매개 변수 유형은 연상 기호에 따라 다릅니다.
나를 돕기 위해 Phobos 라이브러리의 std.conv: parse
을 사용하고 싶습니다. 그러나 양쪽 끝에 공백으로 구분 된 일부 문자로 "단어"를 구문 분석하는 방법에 대한 설명서를 이해하지 못합니다. 정수 등에서는 int i = parse!int(line)
과 같이 잘 작동합니다. 하지만 내가 string s = parse!string(line)
일 경우 전체 라인을 차지할 것입니다.
나는 이것을 C로 썼을 때처럼 데이터 형식으로 char**
(또는 ref string
)을 사용하여 차가 구문 분석합니다.하지만 D를 배우려하고 있습니다.
string get_word(ref string s)
{
int i = 0;
while (i < s.length && isAlphaNum(s[i]))
i++;
string word = s[0 .. i];
s = s[i+1 .. $];
return word;
}
이 그것을 할 수있는 좋은 방법이 있나요? 더 깨끗한 방법이 있습니까? 더 빠른 방법? 아마도 더 안전한 방법일까요? i+1
색인이 항상 존재하는지 잘 모르겠습니다.
도움 주셔서 감사합니다.
나는 모든 종류의 문제를 겪었으므로 D에 대한 나의 신념은 이미 약간 줄어들고 있습니다. 그러나 그 길은 확실하게 가치가있을 것입니다.
문자열이 앞으로 이동합니까? 또한, 개행을 치면 어떻게 될까? 또한, 문자열을 두 번 통과하지 않습니까? 아, 그리고 .idup없이 작동하는 것 같습니다. 이유를 설명해 주시겠습니까? – Matej
이 작은 함수는 첫 번째 공백의 위치를 저장하고 ";"에 대해 동일한 작업을 수행합니다. 작은 위치는 슬라이스에 필요한 끝을 보여줍니다. – bioinfornatics
흥미 롭습니다, 감사합니다. 하지만 countWill과 함께 "isWhite"함수를 어떻게 사용합니까? 나는 그것을 작동시키는 것처럼 보일 수 없다. 나는 "isWhite"의 부정을 원한다. – Matej