You could do something like this:
(?'Chapter'\w* ){1,3}(?'chapter_number'\d{1,3}) (?'Verse'\w*){1} (?'verse_number'\d){1,3}
You probably don't need to worry about doing a general match on the chapter and verse, since it sounds like you know they will always be the same word(s) As such you could simplify the above to be:
(?'chapter'CHAPTER \d{1,3}) (?'Verse'\d{1,3})
The labels give you a means of decifering between the number, and the ranges allow you to be explicit on how many digits the numbers match to.
Update
If you are needing it to match the CHAPTER 1 1 (some text) Or the 2 (some text) scenarios you could also do this:
((?'chapter'CHAPTER \d{1,3}) (?'verse'\d{1,3})(?'verse_text2'.*))|(^(?'verse2'\d{1,3})(?'verse_text'.*))
You can try these out here. I find the site to be helpful at times for doing sanity checks.
Since you are working with Java, this site could be more helpful to you.
There are some syntax differences with group naming in java. This stack overflow answer is quite nice for calling out the use and some of the limitations.
Last edit to show an example that is a little more Java compliant. Try it on the RexexPlanet site.
((?<chapter>CHAPTER \d{1,3}) (?<verse>\d{1,3})(?<verseText>.*))|(^(?<verse2>\d{1,3})(?<verseText2>.*))
I used the following for my test input.
The Book About Old Moldy Cheese
CHAPTER 1 1 The chease is old and moldy.
2 No it isn't
3 Yes it is
4 No it isn't
5 I said, yes it is.
Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is. Yes it is.
6 Lame story
I hope this helps.