2013-11-24 1 views
0

재생 프레임 워크에서 스칼라를 사용하고 있습니다. 트위터와 같은 해시 태그 시스템을 만들고 싶습니다. 하지만 다중 해시 태그의 경우 문제가 있습니다. 내가 아래에 주어진 문자열과 같은 입력 후 내가 스칼라 해시 태그의 두 인스턴스에 하이퍼 링크를 가지고 있지만 자바 해시 태그를주는 경우에 여기재생 프레임 워크가있는 스칼라의 다중 해시 태그 시스템

def hashTag = Action{ implicit request => 
     val body = request.body.asFormUrlEncoded 
     var textValue=body.get("text").get(0) //get text value from post method 
     textValue = textValue.trim() 
     val array = textValue.split(" ")  //split from 'space' to get first word 
     val firstWord = array(0) 
     if (firstWord.length() > 1) { 
     val split = firstWord.split("#") //split word from # 
     if (split.length >= 2) { 
      val hashTag = split(1)   //fetch first hash-tag from textValue variable 
      val link = "<a href=\"/hashtag/" + hashTag + "\">" + hashTag + "</a>" //create a link to hash-tag page 
      textValue=textValue.replace(hashTag, link) 

      //Insert textValue in database 
      }//end if 
     }//end if 
}//end hashTag 

.. 내 컨트롤러 코드입니다. Java 해시 태그를 < a href = '/ hashtag/Java'> Java로 바꾸고 데이터베이스에 저장하려고합니다.

내가 그것을 할 수있는 방법 도와주세요 #scala의 #java의 #scala. 미리 감사드립니다.

답변

1

실제로 모든 해시 태그를 통해 루프가 없기 때문에 코드가 실행되고 있지 않습니다. 찾은 첫 번째 해시 태그를 가져 와서 문자열에있는 첫 번째 해시 태그를 가져오고 다음 문자로 계속 이동하지 않습니다.

Regular Expressions을 사용하면 솔루션을 단순화 할 수 있습니다. 해시 태그와 일치하는 정규식을 정의 할 수 있습니다 : #(\w+). 정규식에서 \w+은 단어 문자와 일치 함을 의미하고 #(\w+)# 기호 다음에 단어 문자와 일치 함을 의미합니다. 당신은 또한 숫자를 지원하고 싶은 경우, 바로 다음과 같은 방법으로 \d로 확장 : #([\w\d]+) 스칼라 정규 표현식에서

는 다음과 같은 방법으로 사용됩니다 :

val textValue: String = "#scala #java #scala" // Our strings we're testing 
val hashTagPattern: Regex = """#(\w+)""".r  // The regular expression we defined 
val textWithLinks: String = hashTagPattern.replaceAllIn(textValue, { m => 
    val hashTag = m.group(1) // Group 1 is referencing the characters in the parentheses 
    s"""<a href="/hashtag/$hashTag">$hashTag</a>"""  // We assemble the link using string interpolation 
}) 
println(textWithLinks) 
// Output: <a href="/hashtag/scala">scala</a> <a href="/hashtag/java">java</a> <a href="/hashtag/scala">scala</a> 

그래서 우리는 다음 hashTagPattern 및 정의 replaceAllIn을 호출합니다.이 매개 변수에는 바꿀 문자열과 Match을 처리하는 함수의 두 가지 매개 변수가 사용됩니다. 이 함수의 형식 정의는 Match => String입니다.

다음으로 우리는이 함수를 만들 : m 우리의 일치와 우리가 # 기호 다음에 해시 태그 문자열을 얻을 수 .group(1)를 사용합니다. 우리가 이것을 가지고 우리는 string literals"""...""" 문자열을 탈출 할 필요가없고 string interpolation 우리의 문자열에 $variableName 우리의 링크를 조립 조립할 수 있습니다.

관련 문제