2009-08-08 1 views
3

java.util.regexp와 같은 개념의 오브젝트 목록에 대해 정규식과 같은 쿼리를 작성할 수있는 라이브러리가 있나요? 개념적으로는 문자 목록과 유사합니다. ?일반 Java 패턴 인식 라이브러리 - List에 대한 regexps와 유사 <Object>

욕심 많고 보수적 인 한정 기호로 패턴을 사용할 수 있고 일치하는 그룹을 식별 할 수 있기를 원합니다. 분명히 목록의 개체에 대해 쿼리 토큰을 일치시키는 코드를 제공해야합니다.

나는 자신의 쿼리 파서를 작성하지 않고 시간을 절약하려고하는 것이 아닙니다. regexp 구현 (문자열에 대한)은 잘 연구 된 영역이며, Sun의 java.util.regex는 오랫동안 그것을 최적화했다는 것을 확실하게 알고 있습니다. 필자가 작성한 모든 것은 거의 효율적이지 않을 것이고 꽤 긴 목록 (꽤 간단한 쿼리)을 처리해야 할 수도 있습니다.

감사합니다.

+0

개체 목록에 대해 regexp와 같은 쿼리가 무슨 뜻인지 확실하지 않습니다. 당신이 어떻게 행동하길 원하는지 보여주는 몇 줄의 코드를 정교하게 설명해 주시겠습니까? 어떤 결과의 왕이 당신을 기대하는지 등 – glmxndr

답변

1

목록에 저장하는 개체가 제한되어 있으면 목록의 개체와 해당 개체에 고유 한 유니 코드 문자 사이에 Map을 만드는 것이 좋습니다. 그래서 당신의리스트가 주어지면 당신을 유일하게 나타내는리스트를 생성 할 것입니다.

그런 다음 생성 된 문자열에 대해 기존 정규식 패키지를 사용할 수 있으며 원하는 내용과 일치시킬 수 있습니다. 그런 다음 목록으로 다시 매핑 할 수 있습니다.

+0

그것은 매우 흥미로운 생각입니다, 감사합니다! 그것은 내 문제를 잘 해결할 수있는 것 같습니다. –

+0

각 개체를 하나의 고유 한 문자로만 매핑하는 방법을 찾아야합니다. 이것은 객체에 대해 해시와 같은 함수를 만드는 것을 의미합니다. 또한 16 비트 문자를 사용하면 목록에 65535 개의 고유 한 객체 만 가질 수 있습니다. 그것은 제한 요소 일 수 있습니다. –

+0

나의 실제 유스 케이스에는 문제가되지 않습니다. 일반적인 경우를 구현하는 경우 필요에 따라 객체를 2 ~ 3 자의 고유 한 시퀀스로 매핑 할 수 있습니다. 나는 또한 객체 아이덴티티 매핑을 사용하고 해싱과 equals()를 사용하는 것을 피할 것이다. 다시 한번 감사드립니다. –

2

같은 것 Quaere. 자신의 사이트에서 :

Quaere는 오픈 소스이며 확장 가능한 프레임 워크로서 Java 응용 프로그램에 SQL을 연상케하는 쿼리 구문을 추가합니다. Quaere를 사용하면 공통된 표현 구문을 사용하여 여러 컬렉션 및 기타 쿼리 가능한 리소스에 대한 예측을 필터링, 열거 및 생성 할 수 있습니다.

+0

SQL과 유사한 구문이 원래 컬렉션의 순서를 캡처하지 않기 때문에 (내가 선택한 하위 집합을 정렬 할 수 있음에도 불구하고) 필요한 것은 아닙니다. SQL은 "select a-follows-b", regexp "ba"에 해당하지 않습니다. –

0

재미있는 생각이지만, 정규식의 힘은 만들 수있는 일반화에서 비롯되며 개체 컬렉션을 통해 검색을 일반화한다는 의미를 정의해야합니다.

나는 "property" "X"가 포함되어 있는지 또는 값이 "Y"인지 (예를 들어, 간단하다고 생각합니다.) 객체 목록을 필터링하는 것이 너무 어렵지 않다고 생각합니다. 이 버전은 아파치 공유지에서, 아마도 beanutils 또는 commons-collections에서). 그렇다면 어떻게 일반화 하시겠습니까? 하나의 확실한 일반화는 문자열 검색에서 정규식 일 수 있지만 "속성 X 또는 속성 Y * 포함"과 같은 것이 더 필요할 것입니다. 또한 클래스 유형이나 하위 수집 집단의 속성을 검색하는 것을 상상할 수도 있습니다.

추상적 인 아이디어로서, 그것은 정말로 흥미 롭습니다. 그러나 특정 개발 문제를 해결하려는 경우 좀 더 제한된 것으로 생각할 수 있습니다. 어떤 종류의 검색을 할 생각입니까?

+0

저는 실제로 상향식 컨텍스트 프리 파서를 작성했습니다. 문법 규칙을 지정하고 파서가 가능한 한 어느 곳에서든지 기회 주의적으로 적용하도록하는 것이 재미 있습니다 (비효율적 인 경우). 하지만 소스 문자열을 토큰 객체의 트리 (중첩 목록)에 lex'ed하고 정규 표현식을 사용하고 싶습니다. 난 그냥 (만 ~ 20 LOC)를 구현 Sawas '아이디어에 이제 덕분에, 내가 쓸 수 있습니다 : mapTokens (파서, " [^ ] * ", ParenGroup); 및 presto, ParenOpen .... ParenClose 어휘 토큰 그룹을 ParenGroup 토큰에 결합하는 규칙이 있습니다. –