Excel : 문자열에서 마지막 문자 / 문자열 일치


187

기본 함수를 사용하여 문자열에서 마지막 문자 / 문자열 일치를 식별하는 효율적인 방법이 있습니까? 즉없는 마지막 문자 / 문자열 문자열하지만, 문자 / 문자열의 마지막에 출현하는 위치 문자열. Search그리고 find두 작품은 왼쪽에서 오른쪽으로 난 긴 재귀 알고리즘없이 적용하는 방법을 생각하지 수 있습니다. 그리고이 솔루션은 이제 쓸모없는 것처럼 보입니다.


3
예를 들어 마침표 "."의 마지막 인스턴스의 위치를 ​​원하기 때문입니다. 문자열 "one.two.three.four"
geotheory

6
질문의 잘못된 읽기가-투표 garners 방법 즐겁게
geotheory

1
다른 관점에서 보았을 때, 다른 사람들도 귀하의 질문에서 의미 한 바를 이해하지 못 했으므로 제안이 올바른 해결책이라는 것을 알았습니다. 선택한 답변조차 "나는 당신이 의미하는 바를 얻는다 "... 비판이 아니라, 사람들이 더 쉽게 대답 할 수 있도록 질문을 더 쉽게 이해하도록 목표로하는 요청입니다.
John Bustos

나는 질문에 대한 예를 추가했습니다해야한다,하지만 난 문자열의 마지막 문자에 대한 쿼리에서이를 구별하기 충분하다고 생각 : search그리고 find모두 쿼리 문자열의 내용은 , '일치'표준 용어, 플러스 링크 된 예이다.
geotheory

답변:


1

최신 버전의 Excel에서는 새로운 기능과 새로운 방법이 제공됩니다. 이전 버전에서는 복제 가능하지만 (이전에는 보지 못했지만) Excel O365가 있으면 다음을 사용할 수 있습니다.

=MATCH(2,1/(MID(A1,SEQUENCE(LEN(A1)),1)="Y"))

하위 문자열의 마지막 위치를 겹치는 데 사용할 수도 있습니다.

=MATCH(2,1/(MID(A1,SEQUENCE(LEN(A1)),2)="YY"))

| Value  | Pattern | Formula                                        | Position |
|--------|---------|------------------------------------------------|----------|
| XYYZ   | Y       | =MATCH(2,1/(MID(A2,SEQUENCE(LEN(A2)),1)="Y"))  | 3        |
| XYYYZ  | YY      | =MATCH(2,1/(MID(A3,SEQUENCE(LEN(A3)),2)="YY")) | 3        |
| XYYYYZ | YY      | =MATCH(2,1/(MID(A4,SEQUENCE(LEN(A4)),2)="YY")) | 4        |

이 둘은 더 이상 임의의 대체 문자를 사용할 수없고 겹치는 패턴을 허용하지만 "단점"은 배열의 사용입니다.


참고 : 이전 Excel 버전에서 동일한 동작을 강제로 수행 할 수 있습니다 .

=MATCH(2,1/(MID(A2,ROW(A1:INDEX(A:A,LEN(A2))),1)="Y"))

암시 적 교차를 제거하기 위해을 통해 입력 CtrlShiftEnter하거나 인라인 INDEX을 사용하여 입력했습니다 .

=MATCH(2,INDEX(1/(MID(A2,ROW(A1:INDEX(A:A,LEN(A2))),1)="Y"),))

1
전체 역사의 명예가 @ tigeravatar의 오랜 솔루션에 속하지만 나는 지금이 상속 진드기를 생각 stackoverflow.com/a/18617720/1156245
geotheory

참고 : 스케치 코드 골프에서 내 제안이 이길 수 있지만 대량으로 사용할 때는 항상 배열 사용을 권장하지는 않습니다. 그러나 명시 적으로 언급하려고 한 다른 이점이 있습니다. 이것은 @Tigeravatar의 답변을 이전과 마찬가지로 관련성이 있습니다!
JvdV

345

나는 당신이 무슨 뜻인지 알 것 같아요. 예를 들어 다음 문자열 (A1 셀에 저장 됨)에서 가장 오른쪽에 \를 원한다고 가정 해 봅시다.

드라이브 : \ Folder \ SubFolder \ Filename.ext

마지막 \의 위치를 ​​얻으려면 다음 공식을 사용하십시오.

=FIND("@",SUBSTITUTE(A1,"\","@",(LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))/LEN("\")))

가장 오른쪽의 \는 문자 24에 있습니다. "@"를 찾고 마지막 "\"을 "@"로 바꾸면됩니다. 사용하여 마지막을 결정합니다

(len(string)-len(substitute(string, substring, "")))\len(substring)

이 시나리오에서 하위 문자열은 단순히 길이가 1 인 "\"이므로 끝 부분을 나누고 다음을 사용할 수 있습니다.

=FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))

이제 이것을 사용하여 폴더 경로를 얻을 수 있습니다.

=LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))))

뒤에 \가없는 폴더 경로는 다음과 같습니다.

=LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))-1)

그리고 파일 이름 만 얻으려면 :

=MID(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1))

그러나 다음은 특정 캐릭터의 마지막 인스턴스에서 모든 것을 올바르게 얻는 대체 버전입니다. 동일한 예제를 사용하면 파일 이름도 반환됩니다.

=TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1)))

24
머리 회전; 머리 회전; 머리 회전; "좋아-이해하지 않고 이걸 사용하고 싶지 않아 .. 어 어, 그래 어 어 ... 잠깐만? 우와! 정말? 천재적이야. 몇 시간 안에 그 생각을하지 않았을 거라 확신 해 며칠이나 몇 주가 아니라면! " -+1, 슬프게도 +5 또는 +10은 내 자신이하기가 어렵 기 때문에 --- 설명이 없다면 : (예제를 사용하여) 아무것도없는 ( SUBSTITUTE3) 모든 인스턴스 \(문자열 길이 단축) 3)-> \(3 번째)가 마지막 것입니다. 독특하고 FIND독특한 캐릭터의 위치로 바꾸십시오 .
Code Jockey

7
영리하다. 셀에 이미 '@'이 포함되어 있지 않다는 점에주의하십시오. 그렇지 않으면 다른 것을 사용해야합니다. 다음을 사용하여 확인할 수 있습니다 =ISNUMBER(SEARCH("@",A1)), @ gwin003 제안한 .
지리학

3
마지막 사건의 오른쪽에있는 모든 것을 추출하기위한 마지막 옵션은 "문자열 y 내에서 문자열 x의 마지막 발생"을 찾고 있었기 때문에 대부분의 목표는 실제로 모든 것을 그 마지막 사건의 권리.
SSilk

1
99? 이 다양한 줄의 길이가 99보다 작다고 가정합니까? 이 대답 과 그런 가정을하지 않는 대답 을 참조하십시오 .
Jean-François Corbett

2
내 데이터는 원래 탭으로 구분 된 파일에서 가져 오기 때문에 "@"대신 CHAR (9) (탭 문자)를 사용했으며 데이터에 포함되지 않을 것이라고 보장했습니다.
Josiah Yoder 2016 년

28

사용자 정의 함수를 작성하고 수식에서 사용하는 것은 어떻습니까? VBA에는 원하는 기능을 InStrRev정확하게 수행하는 기본 제공 기능 이 있습니다.

이것을 새 모듈에 넣으십시오.

Function RSearch(str As String, find As String)
    RSearch = InStrRev(str, find)
End Function

그리고 함수는 다음과 같습니다 (원래 문자열이 B1에 있다고 가정).

=LEFT(B1,RSearch(B1,"\"))

2
이것은 매우 단순하지만 작동하는 솔루션입니다. 프로젝트에서 일부 VBA를 사용할 수 있으면이 VBA를 사용하십시오.
Patrick Hofman 2016 년

7

tigeravatar와 Jean-François Corbett는이 공식을 사용하여 "\"문자의 마지막 발생 문자열을 생성 할 것을 제안했습니다.

=TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1)))

구분자로 사용 된 문자가 공백 ""인 경우 수식을 다음과 같이 변경해야합니다.

=SUBSTITUTE(RIGHT(SUBSTITUTE(A1," ",REPT("{",LEN(A1))),LEN(A1)),"{","")

언급 할 필요는 없습니다. "{"문자는 처리 할 텍스트에서 "정상적으로"발생하지 않는 문자로 대체 될 수 있습니다.


이 솔루션이 더 우아하고 이해하기 쉽다는 것을 알았습니다. 또한 LEN (A1)에 숫자를 곱하면 원래 문자열에 공백이 포함되어 있지 않으면 마지막으로 n 번째를 얻을 수 있습니다.
Zlatin Zlatev

4

VBA가 필요없는이 솔루션을 생각해 냈습니다.

내 예제에서 "_"의 마지막 발생을 찾으십시오.

=IFERROR(FIND(CHAR(1);SUBSTITUTE(A1;"_";CHAR(1);LEN(A1)-LEN(SUBSTITUTE(A1;"_";"")));0)

밖으로 설명했다;

SUBSTITUTE(A1;"_";"") => replace "_" by spaces
LEN( *above* ) => count the chars
LEN(A1)- *above*  => indicates amount of chars replaced (= occurrences of "_")
SUBSTITUTE(A1;"_";CHAR(1); *above* ) => replace the Nth occurence of "_" by CHAR(1) (Nth = amount of chars replaced = the last one)
FIND(CHAR(1); *above* ) => Find the CHAR(1), being the last (replaced) occurance of "_" in our case
IFERROR( *above* ;"0") => in case no chars were found, return "0"

이것이 도움이 되었기를 바랍니다.


3

내가 만든이 함수를 사용하여 문자열 내에서 문자열의 마지막 인스턴스를 찾을 수 있습니다.

허용되는 Excel 수식이 작동하는지 확인하지만 읽고 사용하기가 너무 어렵습니다. 언젠가는 작은 덩어리로 나뉘어 유지 보수가 가능해야합니다. 아래 내 함수는 읽을 수 있지만 명명 된 매개 변수를 사용하여 수식에서 호출하기 때문에 관련이 없습니다. 이것은 그것을 사용하는 것을 간단하게 만듭니다.

Public Function FindLastCharOccurence(fromText As String, searchChar As String) As Integer
Dim lastOccur As Integer
lastOccur = -1
Dim i As Integer
i = 0
For i = Len(fromText) To 1 Step -1
    If Mid(fromText, i, 1) = searchChar Then
        lastOccur = i
        Exit For
    End If
Next i

FindLastCharOccurence = lastOccur
End Function

나는 이것을 다음과 같이 사용한다 :

=RIGHT(A2, LEN(A2) - FindLastCharOccurence(A2, "\"))

2

@ SSilk에 의해 작성된 의견의 일부를 고려할 때 내 최종 목표는 실제로 마지막 사건의 오른쪽에있는 모든 것을 얻는 것이 었습니다 . 매우 간단한 공식을 사용하는 대체 방법 A은 문자열 의 열 (예 :) 을 복사 하고 복사하는 것입니다 (예 : ColumnB) 찾기 및 바꾸기를 적용하십시오. 예를 들어 예를 들면 다음과 같습니다.Drive:\Folder\SubFolder\Filename.ext

무엇을 찾다

이것은 어쨌든 객관적 인 Filename.ext캐릭터의 마지막 인스턴스 (여기 ) 뒤에 남아있는 것을 (here ) 반환하고 \다음과 같은 짧은 공식으로 마지막 캐릭터의 위치를 ​​찾는 것을 용이하게합니다.

=FIND(B1,A1)-1

1

나는 파티에 조금 늦었지만 이것이 도움이 될 수 있습니다. 질문의 링크는 비슷한 공식을 가지고 있지만 내 오류를 제거하기 위해 IF () 문을 사용합니다.

Ctrl + Shift + Enter를 두려워하지 않으면 배열 수식을 사용하면 좋습니다.

문자열 (A1 셀) : "one.two.three.four"

공식:

{=MAX(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)))}  use Ctrl+Shift+Enter

결과 : 14

먼저,

ROW($1:$99)

1에서 99까지의 정수 배열을 반환합니다 {1,2,3,4,...,98,99}.

다음,

MID(A1,ROW($1:$99),1)

대상 문자열에서 찾은 1- 길이 문자열의 배열을 반환 한 다음 대상 문자열의 길이에 도달 한 후 빈 문자열을 반환합니다. {"o","n","e",".",..."u","r","","",""...}

다음,

IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99))

배열의 각 항목을 문자열 "."과 비교합니다. 문자열의 문자 색인 또는 FALSE를 반환합니다.{FALSE,FALSE,FALSE,4,FALSE,FALSE,FALSE,8,FALSE,FALSE,FALSE,FALSE,FALSE,14,FALSE,FALSE.....}

마지막,

=MAX(IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99)))

배열의 최대 값을 반환합니다. 14

이 공식의 장점은 짧고 이해하기 쉽고 고유 한 문자가 필요하지 않다는 것입니다.

단점은 Ctrl + Shift + Enter를 사용해야하며 문자열 길이에 대한 제한입니다. 아래에 표시된 변형으로이 문제를 해결할 수 있지만 해당 변형은 일시적 (읽기 : 느림) 함수 인 OFFSET () 함수를 사용합니다.

이 공식의 속도가 다른 것에 비해 확실하지 않습니다.

변형 :

=MAX((MID(A1,ROW(OFFSET($A$1,,,LEN(A1))),1)=".")*ROW(OFFSET($A$1,,,LEN(A1)))) works the same way, but you don't have to worry about the length of the string

=SMALL(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)),2) determines the 2nd occurrence of the match

=LARGE(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)),2) determines the 2nd-to-last occurrence of the match

=MAX(IF(MID(I16,ROW($1:$99),2)=".t",ROW($1:$99))) matches a 2-character string **Make sure you change the last argument of the MID() function to the number of characters in the string you wish to match!


0

VBA에서이를 수행하는 간단한 방법은 다음과 같습니다.

YourText = "c:\excel\text.txt"
xString = Mid(YourText, 2 + Len(YourText) - InStr(StrReverse(YourText), "\" ))

0

파티에 늦었지만 간단한 솔루션은 VBA를 사용하여 사용자 정의 함수를 만드는 것입니다.

통합 문서, 워크 시트 또는 VBA 모듈에서 VBA에 함수 추가

Function LastSegment(S, C)
    LastSegment = Right(S, Len(S) - InStrRev(S, C))
End Function

그런 다음 셀 수식

=lastsegment(B1,"/")

셀에서 셀 B1에서 검색 할 문자열은 셀 B1에서 마지막 "/"뒤의 텍스트로 셀을 채 웁니다. 길이 제한 없음, 모호한 수식 없음. 내가 생각할 수있는 단점은 매크로 사용 통합 문서가 필요하다는 것입니다.

기본 제공 Excel 함수에 대한 매개 변수를 포함하여 셀 수식에 값을 반환하기 위해이 방법으로 모든 사용자 VBA 함수를 호출 할 수 있습니다.

이 함수를 과도하게 사용하려는 경우 문자가 문자열에없는 경우 문자열이 비어있는 경우를 확인하려고합니다.


0

세포 A1 = find/the/position/of/the last slash

간단한 방법은 텍스트를 뒤집은 다음 평소와 같이 첫 번째 슬래시를 찾는 것입니다. 이제 전체 텍스트에서이 숫자를 뺀 길이를 얻을 수 있습니다.

이렇게 :

=LEN(A1)-FIND("/",REVERSETEXT(A1),1)+1

마지막 21의 위치 인 21을 반환합니다.


REVERSETEXT표준 Excel 공식이 아님
d219
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.