Comments (4)
I don't follow the logic that you're using. Why not just try a simpler pattern, like [A-Za-z]+ (" "* [iI]+)?
? Here's what I get when I use this pattern in irb:
irb> require 'citrus'
=> true
irb> rule = Citrus.rule '[A-Za-z]+ (" "* [iI]+)?'
=> /[A-Za-z]/+ (" "* /[iI]/+)?
irb> rule.test 'Love III'
=> 8
irb> rule.test 'Immelman'
=> 8
irb> rule.test 'Donald'
=> 6
from citrus.
Because I have another rule, which would conflict with this. If I do it like you, then the name David Love III
would parse as first name David
, middle name Love
and last name III
. But the first name should be Davis
and last name Love III
. What I'm trying with my rule is to make sure that the last name can not be only I's
.
Maybe it's simpler if I give you the whole grammar:
grammar Name
rule name
first_name space middle_name space last_name |
first_name space last_name |
first_name
end
rule first_name
[A-Za-z]+
end
rule last_name
[A-Za-z]+ space [iI]+ | [iI]+ &[^iI]+ | [^iI] [A-Za-z]+
end
rule middle_name
([A-Za-z] '.') {
delete('.')
}
| [A-Za-z]+
end
rule space
[ \t]*
end
end
from citrus.
Why don't you try something like this:
require 'citrus'
Citrus.eval(<<CITRUS)
grammar Name
rule name
first_name space middle_name space last_name space suffix? |
first_name space last_name space suffix? |
first_name
end
rule first_name
[A-Za-z]+
end
rule middle_name
([A-Za-z] '.') {
delete('.')
}
| [A-Za-z]+
end
rule last_name
!suffix [A-Za-z]+
end
rule suffix
[iI]+ | `jr` '.'?
end
rule space
[ \t]*
end
end
CITRUS
puts Name.parse("David Love III").dump
This grammar separates out the suffix of the name (I've allowed for "jr." as well, just to demonstrate) from the last name. You can see in the dump of the match how the various tokens are broken up.
from citrus.
Ahh, nice. Thanks!
from citrus.
Related Issues (20)
- Does not run on Rubinius HOT 1
- super cannot be at the end of a rule
- Question about repetition of nested rules HOT 1
- Support for inheritance?
- Unable to collect parse results HOT 1
- Custom Rule (ex Lemmatization) HOT 4
- Review for releasing 2.5.0 HOT 3
- Display parse matches or state on ParseError HOT 3
- Ruby 2.2.0 Warnings for named arguments
- Documentation missing HOT 4
- Cut a minor release with recent warning fixes. HOT 3
- Add support for Rubinius HOT 4
- README instructions not working (grammars not included)
- A way to pass context to grammar/rules HOT 1
- Broken extension on Ruby 2.5 HOT 1
- Segfault in Citrus during toml-rb initialization with Ruby 3.0 HOT 5
- Logic.parse() failed to correctly parse expression that contains space in array's element
- calc.citrus et al not included in gem
- Release 3.0.3? HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from citrus.