| Line 62: | Line 62: | ||
STRING_SPLIT("usr/local/lib","/") | STRING_SPLIT("usr/local/lib","/") | ||
{(1↦"usr"),(2↦"local"),(3↦"lib")} | {(1↦"usr"),(2↦"local"),(3↦"lib")} | ||
* <tt>STRING_JOIN</tt> takes a sequence of strings and a separator string | * <tt>STRING_JOIN</tt> takes a sequence of strings and a separator string and joins the strings together inserting the separators as often as needed. | ||
It is the inverse of the <tt>STRING_SPLIT</tt> function. | It is the inverse of the <tt>STRING_SPLIT</tt> function. | ||
STRING_JOIN(["usr","local","lib"],"/") | STRING_JOIN(["usr","local","lib"],"/") | ||
| Line 75: | Line 74: | ||
* <tt>STRING_TO_LOWER</tt> converts a string to lower-case letters. It currently converts also diacritical marks (this behaviour may in future be controlled by an additional flag or option). | * <tt>STRING_TO_LOWER</tt> converts a string to lower-case letters. It currently converts also diacritical marks (this behaviour may in future be controlled by an additional flag or option). | ||
* <tt>STRING_EQUAL_CASE_INSENSITIVE</tt> compares two strings ignoring lower/upper case distinctions and diacritical marks. It works as if converting the strings using <tt>STRING_TO_UPPER</tt> before comparing. | * <tt>STRING_EQUAL_CASE_INSENSITIVE</tt> compares two strings ignoring lower/upper case distinctions and diacritical marks. It works as if converting the strings using <tt>STRING_TO_UPPER</tt> before comparing. | ||
* <tt>INT_TO_STRING</tt>,... | STRING_EQUAL_CASE_INSENSITIVE("aOuB","AoUB") | ||
TRUE | |||
* <tt>SUB_STRING</tt> takes a strings a position and a sequence and produces a corresponding substring. The numbering starts at 1 and the position must be at least 1, but can extend beyond the end of the string. | |||
SUB_STRING("abcdefg",1,3) | |||
"abc" | |||
* <tt>STRING_IS_INT</tt> takes a string and is true if the string represents an integer. | |||
* <tt>STRING_TO_INT</tt> takes a string and converts it into an integer. An error is raised if this cannot be done. It is safer to first check with `STRING_IS_INT` whether the conversion can be done. | |||
* <tt>INT_TO_STRING</tt> converts an integer to a string representation. | |||
* <tt>DEC_STRING_TO_INT</tt> takes a decimal string (with optional decimal places) and converts it to an integer with the given precision (rounding if required). | |||
DEC_STRING_TO_INT("1024",2) | |||
102400 | |||
* <tt>INT_TO_DEC_STRING</tt> converts an integer to a decimal string representation with the precision provided by the second argument. | |||
* <tt>INT_TO_HEX_STRING</tt> converts an integer to a hexadecimal string representation. | |||
* <tt>STRING_IS_DECIMAL</tt> takes a string and is true if the string represents a decimal number. It requires a decimal point and digits both before and after the decimal point. | |||
* <tt>STRING_IS_ALPHANUMERIC</tt> takes a string and is true if the string is non empty and contains only alphanumeric letters (a-z,A-Z,0-9) and nothing else. | |||
* <tt>STRING_IS_NUMBER</tt> takes a string and is true if the string represents a number. | |||
* <tt>STRING_PADLEFT</tt> adds a padding character at the left of a string if the size of the string is below the argument given. | |||
STRING_PADLEFT("10",5,"0") | |||
"00010" | |||
* <tt>TO_STRING</tt> converts a B data value to a string representation. | |||
* <tt>FORMAT_TO_STRING</tt> takes a format string and a B sequence of values and generates an output string, where the values have been inserted into the format string in place of the `~w` placeholders. The length of sequence must correspond to the number of `~w` in the format string. The format string follows the conventions of SICStus Prolog. E.g., one can use `~n` for newlines. | |||
* <tt>STRINGIFY</tt> converts a B expression to a string representation of the expression, not the value. It can be used to obtain the name of variables. Warning: ProB may simplify and rewrite expressions (you can turn this off by setting the OPTIMIZE_AST preference to false). | |||
=== LibraryRegex === | === LibraryRegex === | ||
<tt>LibraryRegex.def</tt>: providing access to regular expression operators on strings (<tt>REGEX_MATCH</tt>, <tt>REGEX_REPLACE</tt>, <tt>REGEX_SEARCH</tt>,...) | <tt>LibraryRegex.def</tt>: providing access to regular expression operators on strings (<tt>REGEX_MATCH</tt>, <tt>REGEX_REPLACE</tt>, <tt>REGEX_SEARCH</tt>,...) | ||
ProB supports the STRING data type also provided by Atelier-B. However, ProB provides considerable additional features described below.
"astring" a specific (single-line) string value
'''astring''' an alternate way of writing (multi-line) strings, no need to escape "
```tstring``` template strings, where ${Expr} or $«Expr» parts are evaluated and converted to string,
you can provide options separated by commas in square brackets like $[2f]{Expr}.
Valid options are: Nf (for floats/reals), Nd (for integer), Np (padding),
ascii (can be abbreviated to a), unicode (can be abbreviated to u).
ProB supports the following escape sequences within strings:
\n newline (ASCII character 13) \r carriage return (ASCII 10) \t tab (ASCII 9) \" the double quote symbol " \' the single quote symbol ' \\ the backslash symbol
Within single-line string literals, you do not need to escape '. Within multi-line string literals, you do not need to escape " and you can use tabs and newlines.
ProB assumes that all B machines and strings use the UTF-8 encoding.
Atelier-B does not support any operations on strings, apart from equality and disequality. In ProB, however, some of the sequence operators work also on strings:
size(s) the length of a string s rev(s) the reverse of a string s s ^ t the concatenation of two strings conc(ss) the concatenation of a sequence of strings
You can turn this support off using the STRING_AS_SEQUENCE preference.
ProB provides various external functions to manipulate strings.
You can obtain the definitions of this library by putting the following into your DEFINITIONS clause:
`DEFINITIONS "LibraryStrings.def"`
The file LibraryStrings.def is bundled with ProB and can be found in the stdlib<\tt> folder. You can also include the machine LibraryStrings.mch<\tt> instead of the definition file; the machine defines some of the functions below as proper B functions (i.e., functions for which you can compute the domain and use constructs such as relational image).
Below are a few of the provided external functions along with some example uses:
STRING_APPEND("abc","abc")
"abcabc"
STRING_LENGTH("abc")
3
STRING_SPLIT("usr/local/lib","/")
{(1↦"usr"),(2↦"local"),(3↦"lib")}
It is the inverse of the STRING_SPLIT function.
STRING_JOIN(["usr","local","lib"],"/") "usr/local/lib"
CODES_TO_STRING([65,66,67]) "ABC"
STRING_EQUAL_CASE_INSENSITIVE("aOuB","AoUB")
TRUE
SUB_STRING("abcdefg",1,3)
"abc"
DEC_STRING_TO_INT("1024",2)
102400
STRING_PADLEFT("10",5,"0")
"00010"
LibraryRegex.def: providing access to regular expression operators on strings (REGEX_MATCH, REGEX_REPLACE, REGEX_SEARCH,...)