2013-05-03 5 views
1

나는 coldfusion에서 만든 목록입니다.목록의 각 단어의 마지막 글자를 제거하는 정규식

<cfset arguments.tags = "battlefieldx, testx, wonderful, ererex"> 

는 내가 뭘하고 싶은 말에서 X를하고 목록에서 단어를 유지 단어에서 'x'를 제거 할 수 있습니다 : 예를 들어 다음과 같은 목록을 사용할 수 있습니다. 명령은 중요하지 않습니다. 정규식은 괜찮을 것이거나 coldfusion으로 반복해도 괜찮을 것입니다.

답변

2

단어의 끝에서 'x'을 가져올 정규식은 매우 간단합니다. 당신이 문자열로 주어진 요소를 가정하면, 당신이 필요로하는 정규식은 단순히 :

REReplace(myString, "x$", "") 

이 지정된 문자열의 끝에 X과 일치 빈 문자열로 대체합니다.

은 쉼표로 구분 된 목록에있는 각 문자열에 대해이 작업을 수행하려면 시도해보십시오 $ 기호는 문자열의 끝을 감지하는 데 사용할 것입니다

REReplace(myString, "x,|x$", ",", "ALL") 
+2

당신의 두 번째 표현은리스트의 말미에'하는'를 추가합니다 - 룩어 (즉'의 X (=? | $)')를 사용하여보고,이 피를 쉼표는 포함하지만 제외 경기에서 (따라서 교체면에서 요구하지 않으므로 마지막에 추가되지 않습니다.) –

+0

@PeterBoughton 당신은 전적으로 옳습니다 - 당신이 더 좋은 대답입니다. –

1
REReplace(myString, "x$", "") 

. 따라서 문자열 끝에 'x'을 감지하십시오. 빈 따옴표로 아무 것도 대체하지 않으므로 'x'이 삭제됩니다. 각 목록 요소의 끝에서 x 제거

5

...

쉼표 또는 문자열의 끝을보다 앞에 모든 x 문자를 제거하려면, 수행

rereplace(arguments.tags , "x(?=,|$)" , "" , "all") 

여기 (?= ) 부분은 미리보기 - 내용의 위치와 일치하지만 바뀐 내용에는 포함되지 않습니다. |은 교대로 나타납니다. 리터럴 ,과 일치하려고 시도하고 실패 할 경우 문자열의 끝 ($)을 찾습니다.


고독한 x를 제거하지 않으려면 다음을 입력하십시오.

하면 (즉, 혼자가 아니라는 것입니다)가 아닌 단어 경계 검사를 사용할 수있는 단어의 끝에서 x가 있는지 확인하려면 ... "X 마크는, 자리"

x 전에 [a-zA-Z0-9_]가없는 경우
rereplace(arguments.tags , "\Bx(?=,|$)" , "" , "all") 

\B가 일치하지 않습니다 - "단어의 끝"을 구성하는 것에 더 복잡/정확한 규칙, 당신은 할 수없는 lookbehind를 필요 재방송으로,하지만 여전히 충분히 쉽게 할 수 있습니다 :

arguments.tags.replaceAll("(?<=\S)x(?=,|$)" , "") 

(단어 앞 부분에 공백이 아닌 문자가 하나만 있어도 단어의 일부로 간주되지만 보이는 너비 내에 한정된 너비의 표현식을 넣을 수 있습니다.)

분명히 어떤 문자를 사용하려면 x[a-zA-Z] 또는 무엇이든지간에.

0

이것은 이미 답변되었지만 둘 중 하나를 사용할 수 있다고 말한 이후 ColdFusion 전용 솔루션을 게시 할 것이라고 생각했습니다.(정규식은 분명히 훨씬 더 쉽게, 그러나 이것은 너무 작동합니다) 당신이 ColdFusion에서이있는 경우

<cfset arguments.tags = "battlefieldx, testx, wonderful, ererex"> 
<cfset temparray = []> 

<cfloop list="#arguments.tags#" index="i"> 
    <cfif right(i,1) EQ 'X'> 
    <cfset arrayappend(temparray,left(i,len(i) - 1))> 
    <cfelse> 
    <cfset arrayappend(temparray,i)> 
    </cfif> 
</cfloop> 

<cfset arguments.tags = arraytolist(temparray)> 

9 이상 또는

<cfloop list="#arguments.tags#" index="i"> 
    <cfset cfif right(i,1) EQ 'X' ? arrayappend(temparray,left(i,len(i) - 1)) : arrayappend(temparray,i)> 
</cfloop> 

또한 arguments.tags을 변환 할 수 라일로 당신이 삼항 연산자를 사용하여 루프를 단순화 할 수 있습니다 배열 및 루프 그런 식으로

<cfloop array="#listtoarray(arguments.tags)#" index="i"> 
    <cfset cfif right(i,1) EQ 'X' ? arrayappend(temparray,left(i,len(i) - 1)) : arrayappend(temparray,i)> 
</cfloop> 
관련 문제