랜덤 문단/단어 추출 – 통합편


 

 

광고

여러 글을 작성해야할 때 여러 문단과 단어를 작성해두고 랜덤으로 문단과 단어를 추출해 글을 자동으로 작성해주는 기능을 Javascript로 만들어보겠습니다.

최근에 올렸던 랜덤 문단 추출 기능랜덤 단어 추출 기능을 합쳐볼 예정입니다.

랜덤 단어 양식

랜덤으로 “사과”, “배”, “바나나” 중 하나를 추출하는 것을 가정해보겠습니다.

일반 문장에서 자주 사용되지 않을 문자인 파이퍼(|)로 구분을 지어보겠습니다.

이것은 사과|배|바나나입니다.

어느 영역이 랜덤 단어가 모여있는지 구별하기 위해 대괄호([ ~]})로 감싸보겠습니다.

이것은 [사과|배|바나나]입니다.

이 문장을 변환하면 대괄호 안에 있는 ‘사과’, ‘배’, ‘바나나’ 중 하나가 선택되어 아래와 같이 출력 된 답니다.

이것은 배입니다.

랜덤 문단 양식

이번엔 여러 줄의 글을 작성하고 그 중 하나의 줄만 추출하는 것을 해보겠습니다.

각 줄은 엔터로 구분이 되고 처음과 끝을 나타내는 구역을 ‘[[‘와 ‘]]’로 묶는 방식을 이용해보겠습니다.

[[
첫 번째 문단입니다.
두 번째 문단입니다.
세 번째 문단입니다.
]]

위와 같이 입력하고 변환을 하면 세 개의 문단 중 임의 줄 하나가 선택되어 출력됩니다.

세 번째 문단입니다.

랜덤 문단/단어 양식

이번에는 위의 두 가지 방법을 모두 사용해보겠습니다.

아래와 같이 예제 문장을 만들어봤습니다.

[[
이것은 [사과|배|바나나]입니다.
저것은 [사과|배|바나나]입니다.
[이것|저것]은 [사과|배|바나나|과자][이다.|입니다.|네요.]
]]

위와 같이 입력하고 변환을 하면 아래와 같이 임의의 문단과 단어가 선택되어 출력됩니다.

저것은 바나나입니다.

랜덤 문단/단어 사용해보기

사용된 코드는 아래와 같습니다.

<script>
function extractRandomString() {
  const inputString = document.getElementById('inputString').value;
  const delimiter = '|'; // 구분자
  const extractPattern = /\[(.*?)\]/g; // 추출할 구역 패턴, 글로벌 플래그 추가

  if (inputString === '') {
    alert('텍스트를 입력하세요.');
    return;
  }

  // replace 함수 내에서 랜덤 선택 로직을 적용
  const resultString = inputString.replace(extractPattern, (match, group1) => {
    const choices = group1.split(delimiter);
    const randomChoice = choices[Math.floor(Math.random() * choices.length)];
    return randomChoice;
  });

  document.getElementById('result').textContent = RandomSentence (resultString); // 결과를 화면에 출력
}

function RandomSentence(str) {
  const regex = /\[\[([\s\S]*?)\]\]/g;
  let sentences = [];
  let match;

  while (match = regex.exec(str)) {
    sentences = match[1].split(/\r?\n/).filter(Boolean);
    const randomIndex = Math.floor(Math.random() * sentences.length);
    const selectedSentence = sentences[randomIndex].trim();
    str = str.replace(match[0], selectedSentence);
    regex.lastIndex -= match[0].length - selectedSentence.length;
  }

  return str;
}  
</script>

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다