Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Subfield Matcher

A subfield matcher is an expression that is applied to a list of subfields (of a data field) and checks whether that list meets the specified criteria. The matcher is primarily used as part of a field matcher and as a constraint in query or path expressions.

The following elementary variants are distinguished:

  • The exists matcher ? checks whether a specific subfield is present
  • The count matcher # checks the number of occurrences a subfield
  • The comparison matcher compares the value of a subfield against a reference value
  • The contains matcher =? checks whether a subfield contains a specific phrase
  • The in matcher in checks whether the value of a subfield comes from a reference list
  • The starts-with matcher =^ checks whether the value of a subfield begins with a prefix
  • The ends-with matcher =$ checks whether the value of a subfield ends with a suffix
  • The similarity matcher =* checks whether the value of a subfield is similar to a reference value
  • The regex matcher =~ checks whether the value of a subfield matches a regular expression

Exists Matcher

The ? operator is used to check whether a data field has one or more subfields. The specific value of the subfield is irrelevant in this context. In the following example, the field 079 is checked to see if a subfield named u exists:

$ marc21 count tests/data/ada.mrc --where '079.a?'
1

By negating the expression, you can check whether a field does not contain a specific subfield:

$ marc21 count tests/data/ada.mrc --where '079{ !u? }'
0

$ marc21 count tests/data/ada.mrc --where '!079.x?'
1

By specifying a code class, you can check whether one of the specified subfields is present. The following example checks whether the field 079 contains either the subfield p or q:

$ marc21 count tests/data/ada.mrc --where '079{ [pq]? }'
1

$ marc21 count tests/data/ada.mrc --where '079.[pq]?'
1

Count Matcher

The count matcher (#) counts the number of occurrences of one or more subfields and compares that number against a reference value. The available comparison operators are ==, !=, >=, >, <=, and <. The count matcher can only be used in the long form of a field matcher.

$ marc21 count tests/data/ada.mrc --where '079{ #u > 2 }'
1

$ marc21 count tests/data/ada.mrc --where '079{ #[aq-w] >= 7 }'
1

Comparison Matcher

The comparison matcher compares the value of a subfield to a reference value. The available comparison operators are ==, !=, >=, >, <=, and <.

$ marc21 count tests/data/ada.mrc --where '075{ b == "piz" }'
1

$ marc21 count tests/data/ada.mrc --where '075.b != "piz"'
1

Optionally, the statement can be quantified using the universal quantifier ALL or the existential quantifier ANY. By default, the existential quantifier is used; that is, the existence of at least one subfield that corresponds to the reference value according to the operator is sufficient for the statement to be true. Quantified expressions can’t be used in the short form of a field matcher.

$ marc21 count tests/data/ada.mrc --where '079{ ALL u >= "k" }'
1

$ marc21 count tests/data/ada.mrc --where '079{ ANY u != "k" }'
1

Contains Matcher

The contains matcher checks whether the specified substring is contained in the specified subfield. Internally, the matcher uses the Aho–Corasick algorithm (with SIMD acceleration in some cases) to enable efficient substring searches.

$ marc21 count tests/data/ada.mrc --where '400/1#{ a =? "Augusta" }'
1

$ marc21 count tests/data/ada.mrc --where '400/1#.a =? "Augusta"'
1

The matcher also allows you to search for multiple substrings at once by specifying a list of substrings:

$ marc21 count tests/data/ada.mrc --where '400/1#.a =? ["Hate", "Love"]'
1

To check whether a substring (or a list of substrings) is not contained, use the !? operator:

$ marc21 count tests/data/ada.mrc --where '400/1#.a !? "Curie"'
1

Finally, the statements can be quantified using the universal quantifier ALL or the existential quantifier ANY. A quantifier can’t be used in the short form of a field matcher.

$ marc21 count tests/data/ada.mrc --where '035{ ALL [az] =? "DE-" }'
1

In Matcher

The in matcher checks whether the value of a subfield comes from a reference list. The values are specified as a non-empty, comma-separated list enclosed in square brackets. If you want to check whether the value of a field does not come from a list, use the not in operator instead of in.

$ marc21 count tests/data/ada.mrc --where '075{ b in ["p", "s", "u"] }'
1

$ marc21 count tests/data/ada.mrc --where '075.b in ["p", "s", "u"]'
1

$ marc21 count tests/data/ada.mrc --where '075.b not in ["b", "f", "g"]'
1

The statements can be quantified using the universal quantifier ALL or the existential quantifier ANY. A quantifier can’t be used in the short form of a field matcher.

$ marc21 count tests/data/ada.mrc --where '079{ ALL u in ["w", "k", "v"] }'
1

Starts-With Matcher

The starts-with matcher checks whether the value of a subfield begins with a prefix. If the matcher is to search for multiple possible prefixes, the values are specified as a list. To check whether the value does not begin with a prefix, the !^ operator is used.

$ marc21 count tests/data/ada.mrc --where '400/1#{ a =^ "Love" }'
1

$ marc21 count tests/data/ada.mrc --where '400/1#.a =^ "Lovelace"'
1

$ marc21 count tests/data/ada.mrc --where '400/1#.a =^ ["Love", "Hate"]'
1

$ marc21 count tests/data/ada.mrc --where '400/1#.a !^ "Hate"'
1

The statements can be quantified using the universal quantifier ALL or the existential quantifier ANY. A quantifier can’t be used in the short form of a field matcher.

$ marc21 count tests/data/ada.mrc --where '400/1#{ ALL d =^ "1815" }'
1

Ends-With Matcher

The ends-with matcher checks whether the value of a subfield ends with a suffix. If the matcher is to search for multiple possible suffixes, the values are specified as a list. To check whether the value does not end with a suffix, the !$ operator is used.

$ marc21 count tests/data/ada.mrc --where '400/1#{ a =$ "Ada" }'
1

$ marc21 count tests/data/ada.mrc --where '400/1#.a =$ "Ada"'
1

$ marc21 count tests/data/ada.mrc --where '400/1#.a =$ ["Ada", "Bob"]'
1

$ marc21 count tests/data/ada.mrc --where '400/1#.a !$ "Ada"'
1

The statements can be quantified using the universal quantifier ALL or the existential quantifier ANY. A quantifier can’t be used in the short form of a field matcher.

$ marc21 count tests/data/ada.mrc --where '400/1#{ ALL d =$ "1852" }'
1

Similarity Matcher

The similarity matcher checks whether the value of a subfield is similar to a reference value. Similarity is determined by calculating the normalized Levenshtein distance between the subfield value and the reference value. The values range from 0.0 to 1.0 (inclusive), where a value of 1.0 indicates that the two values match. A match is considered to exist if the similarity value is greater than or equal to the threshold value, which can be configured using the command-line option --strsim-threshold and defaults to 80 (≙ 0.8). To check for non-similarity, the !* operator is used.

$ marc21 count tests/data/ada.mrc --where '400/1#{ a =* "Kong, Ada" }'
1

$ marc21 count tests/data/ada.mrc --where '400/1#{ a =* "Hatless, Ada" }'
0

$ marc21 count tests/data/ada.mrc --where '400/1#{ a !* "Hatless, Ada" }'
1

The statements can be quantified using the universal quantifier ALL or the existential quantifier ANY. A quantifier can’t be used in the short form of a field matcher.

Regex Matcher

The regex matcher =~ checks whether the value of a subfield matches a regular expression. To check multiple patterns at once, list all patterns in square brackets. To check whether the value does not match a regular expression, use the !~ operator.

Note

Not all regex functions are supported. Please consult the syntax documentation of the regex library used in this project if you have any questions.

Also keep in mind that, depending on the context and the type of quotes used (single or double), special characters in the regular expression may need to be quoted.

$ marc21 count tests/data/ada.mrc --where '400/1#{ d =~ "^\\d{4}-\\d{4}$" }'
1

$ marc21 count tests/data/ada.mrc --where '075.b =~ ["^[bfg]$", "^piz$"]'
1

$ marc21 count tests/data/ada.mrc --where '400/1#.d =~ "^\\d{4}-\\d{4}$"'
1

$ marc21 count tests/data/ada.mrc --where 'ALL 075.2 =~ "^gnd(gen|spec)$"'
1

$ marc21 count tests/data/ada.mrc --where '075.b !~ "^[bfg]$"'
1

The statements can be quantified using the universal quantifier ALL or the existential quantifier ANY. A quantifier can’t be used in the short form of a field matcher.

$ marc21 count tests/data/ada.mrc --where '079{ ALL u =~ "^[a-z]$" }'
1

Tip

The Rustexp website offers a regular expression editor and tester.